XML 쿼리 언어

XE는 다양한 DB를 지원하기 위해 SQL 쿼리를 그대로 사용하지 않고 XML로 작성합니다.

  1. 사용 방법

XML 쿼리는 모듈과 애드온, 위젯 등에서 다음과 같이 사용할 수 있습니다.

$args->name = "zero";

$output = executeQuery("member.getMemberInfo", $args);

executeQuery() 함수는 ./classes/db/DB.classs.php에 있는 DB::executeQuery() 함수의 별칭(alias)입니다. 이 함수는 실제 DB 데이터를 조작하고 사용된 DB에 따라 XML 쿼리가 네이티브 SQL로 파싱된 후에 결과를 수신합니다.

function executeQuery($xml_query_name, $args = null);

  • 첫 번째 파라미터는 실행될 XML 쿼리의 이름입니다. 값은 "모듈이름.쿼리ID"입니다.
  • 두 번째 파라미터는 stdClass의 타입으로서, 데이터를 쿼리에 전달하는 데 사용됩니다. 이 파라미터는 널(null)이 될 수 있습니다.
  • 결과값은 Object 클래스의 객체로 반환됩니다.
  • $output->toBool()이 FALSE이면 쿼리 실패를 의미하며, $output->toBool()이 TRUE이면 쿼리가 정상적으로 실행되었다는 뜻입니다.
  • select문의 결과는 $output->data 변수에 넣어 반환됩니다.
  1. XML 요소

<query id="query_id" action="select|update|delete|insert">

<tables>

<table name="tableName" alias="alias" />

</tables>

<columns>

<column name="columnName" alias="alias" />

</columns>

<conditions>

<condition operation="doSomething" column="column1" var="variable" filter="filterType" default="default" notnull="notnull" minlength="minimumLength" maxlength="maximumLength" pipe="TheConcatenationOperator "/>

<group pipe="pipe">

<condition operation="anotherOperation" column="column" var="variable" filter="filterType" default="default" notnull="notnull" minlength ="minimumLength" maxlength="maximumLength" pipe="TheConcatenationOperator"/>

</group>

</conditions>

<navigation>

<index var="var" default="default" order="desc|asc" />

<list_count var="var" default="default" />

<page_count var="var" default="default" />

<page var="var" default="default" />

</navigation>

<groups>

<group column="GroupBy daesang" />

</groups>

</query>

XML 쿼리에 사용되는 XML 요소와 속성은 다음과 같습니다.

33 XML 쿼리에 사용되는 XML 요소와 속성

요소

속성

설명

<query>

쿼리 XML의 최상위 요소

id

쿼리 검색을 위한 아이디. module.query_id를 사용해서 쿼리 XML 파일을 검색하고 사용합니다.

action

액션은 select, update, delete, insert 이렇게 네 가지 타입입니다.

alias

서브쿼리를 사용할 때 쿼리문의 alias명입니다.

<tables>

쿼리에 사용될 테이블의 모음

<table>

테이블 요소

name

원래 테이블 이름(XE의 접두어는 무시)

alias

열 지정이나 검색 등에서 사용할 테이블 별칭

<columns>

쿼리에 사용될 열 모음

<column>

열 요소

name

열 이름

alias

원래 열의 이름을 변경할 때 사용

<conditions>

조건문을 만들 때 사용. <group> 요소를 사용해서 조건문을 여러 그룹으로 구분할 수 있습니다.

<group> ...

</group>

조건문이 그룹으로 사용될 때 pipe="and|or"를 사용해서 그룹 간 조건을 지정할 수 있습니다.

<condition>

조건문

operation

다음과 같은 연산자로 처리할 수 있습니다.

  • equal : column = (var|default)
  • more : column >= (var|default)
  • excess : column > (var|default)
  • less : column <= (var|default)
  • below : column < (var|default)
  • notequal : column != (var|default)
  • notnull : column is not null
  • null : column is null
  • like_prefix : column like '%var|default'
  • like_tail : column like 'var|default%'
  • like : column like '%var|default%'
  • in : column in (var|default)
  • notin : column not in (var|default)

column

열 이름을 지정합니다.

var

executeQuery(Array)() 함수의 두 번째 파라미터인 stdClass의 키값을 지정합니다.

filter

var값의 조건 필터링. 지원되는 필터는 다음과 같습니다.

  • email, email_address: 메일 형식
  • homepage: http|https:// 같은 웹사이트 주소 형식
  • userid, user_id: XE의 사용자 id 형식(첫 두 글자는 알파벳이어야 합니다. 세 번째 문자부터 number+alphabet+ _ 형식으로 합니다.)
  • number: 숫자 허용
  • alpha: 알파벳 허용
  • alpha_number: 숫자와 문자 모두 허용

default

var값이 널이면 기본값으로 대체. 기본값은 일반 문자열, 숫자 모두사용 가능하며, 아래와 같은 함수를 사용할 수도 있습니다.

  • ipaddress(): IP 주소
  • unixtime(): 유닉스 시간(php 내 time() 함수)
  • curdate(): YYYYMMDDHHIISS
  • plus(int count): column = column + count
  • minus(int count): column = column – count
  • multiply(int arg): column = column * arg
  • sequence(): XE의 getNextSequence()를 실행

notnull

널인지 확인. 지정하면 반드시 var의 값이 있어야 합니다.

minlength

최소 길이 확인

maxlength

최대 길이 확인

pipe

and|or 같은 조건 지정

<navigation>

정렬 순서나 페이징을 지원

<index>

정렬될 열과 정렬 방식 지정

var

열 이름이 값인 변수 이름

default

var값이 지정되지 않은 경우 사용되는 기본으로 정렬된 열 이름

order

정렬 방식. asc|desc가 아닌 변수의 이름을 사용하면, 변수의 값에 따라 정렬됩니다. 단, 변수의 값은 asc|desc로 전달되어야 합니다(오름차순 "asc", 내림차순 "desc")

<list_count>

페이징 결과를 수신할 수 있게 합니다.

var

행의 개수가 값인 변수 이름

default

var값이 지정되지 않으면 사용되는 행의 개수 기본값

<page_count>

페이징을 계산할 때 내비게이션 개수 지정

var

페이징 내비게이션의 개수가 값인 변수 이름

default

var값이 지정되지 않으면 사용되는 기본 페이징 내비게이션의 개수

<page>

현재 페이지 번호 지정

var

현재 페이지 번호를 값으로 가지는 변수 이름

default

var값이 지정되지 않으면 사용되는 기본 페이지 번호

<groups>

조건문에 따라 그룹을 사용할 수 있게 합니다.

group by절 사용 시 작성

column

group by 기준 열 이름

  1. XML 서브쿼리 사용 예제

XE 1.5 버전부터 서브쿼리를 작성할 수 있습니다. 아래는 서브쿼리 타입별 작성 예입니다.

  • Select절 사용

SQL 사용 예

select *,

(select count(*) as "count"

from "xe_documents" as "documents"

where "documents"."user_id" = "member"."user_id"

) as "totaldocumentcount"

from "xe_member" as "member"

where "user_id" = 7

XML 서브쿼리 작성 예

<query id="getStatistics" action="select">

<tables>

<table name="member" alias="member" />

</tables>

<columns>

<column name="*" />

<query id="getMemberDocumentCount" alias="totalDocumentCount">

<tables>

<table name="documents" alias="documents" />

</tables>

<columns>

<column name="count(*)" alias="count" />

</columns>

<conditions>

<condition operation="equal" column="documents.user_id" default="member.user_id" />

</conditions>

</query>

</columns>

<conditions>

<condition operation="equal" column="user_id" var="user_id" notnull="notnull" />

</conditions>

</query>

  • Where절 사용

SQL 사용 예

SELECT *

FROM xe_member as member

WHERE regdate = (SELECT MAX(regdate) as regdate

FROM xe_documents as documents

WHERE documents.user_id = member.user_id)

XML 서브쿼리 작성 예

<query id="getMemberInfo" action="select">

<tables>

<table name="member" alias="member" />

</tables>

<columns>

<column name="*" />

</columns>

<conditions>

<query operation="equal" column="regdate" notnull="notnull" alias="documentMaxRegdate">

<tables>

<table name="documents" alias="documents" />

</tables>

<columns>

<column name="max(regdate)" alias="maxregdate" />

</columns>

<conditions>

<condition operation="equal" column="documents.user_id" var="member.user_id" notnull="notnull" />

</conditions>

</query>

</conditions>

</query>

  • From절 사용

SQL 사용 예

SELECT m.member_srl, m.nickname, m.regdate, a.count

FROM (

SELECT documents.member_srl as member_srl, count(*) as count

FROM xe_documents as documents

GROUP BY documents.member_srl) a

INNER JOIN xe_members m on m.member_srl = a.member_srl

XML 서브쿼리 작성 예

<query id="getMemberInfo" action="select">

<tables>

<table query=”true” alias="a">

<table>

<table name="documents" alias="documents" />

</table>

<columns>

<column name="member_srl" alias="member_srl" />

<column name="count(*)" alias="count" />

</columns>

<groups>

<group column="member_srl" />

</groups>

</table>

<table name="member" alias="m" type="inner join">

<conditions>

<condition operation="equal" column="m.member" default="a.member_srl" />

</conditions>

</table>

</tables>

<columns>

<column name="m.member_srl" />

<column name="m.nickname" />

<column name="m.regdate" />

<column name="a.count" />

</columns>

</query>