SnowConvert: Teradata SQL - JavaScript (프로시저)¶
GET DIAGNOSTICS EXCEPTION¶
설명 ¶
GET DIAGNOSTICS 는 진단 영역에서 성공, 예외 또는 완료 조건에 대한 정보를 검색합니다.
Teradata GET DIAGNOSTICS 에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.
GET DIAGNOSTICS
{
[ EXCEPTION < condition_number >
[ < parameter_name | variable_name > = < information_item > ]...
]
|
[ < parameter_name | variable_name > = < information_item > ]...
}
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
샘플 소스 패턴 ¶
Teradata ¶
-- Additional Params: -t JavaScript
CREATE PROCEDURE getDiagnosticsSample ()
BEGIN
DECLARE V_MESSAGE, V_CODE VARCHAR(200);
DECLARE V_Result INTEGER;
SELECT c1 INTO V_Result FROM tab1;
GET DIAGNOSTICS EXCEPTION 1 V_MESSAGE = MESSAGE_TEXT;
END;
Snowflake ¶
CREATE OR REPLACE PROCEDURE getDiagnosticsSample ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
var V_MESSAGE;
var V_CODE;
var V_RESULT;
EXEC(`SELECT c1 FROM tab1`,[]);
[V_RESULT] = INTO();
V_MESSAGE = MESSAGE_TEXT;
$$;
문제 파악¶
지원되지 않는 조건 특성 문
CLASS_ORIGIN
CONDITION_IDENTIFIER
CONDITION_NUMBER
MESSAGE_LENGTH
RETURNED_SQLSTATE
SUBCLASS_ORIGIN
매크로¶
설명¶
Teradata의 MACRO 문은 Snowflake MACRO 구문으로 변환됩니다.
Teradata MACRO 에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
샘플 소스 패턴¶
매크로 변환 생성하기¶
Teradata
-- Additional Params: -t JavaScript
CREATE MACRO new_table (col1 INTEGER, col2 VARCHAR(12))
AS
(
insert into table1 (col1, col2) values (:col1, :col2);
select * from table1 where col1 = :col1;
);
Snowflake
CREATE OR REPLACE PROCEDURE new_table (COL1 FLOAT, COL2 VARCHAR(12))
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`INSERT INTO table1 (col1, col2)
VALUES (:1, :2)`,[COL1,COL2]);
INSERT_TEMP(`SELECT * from table1 where col1 = :1`,[COL1]);
return tablelist;
$$;
Known Issues¶
1. Macro transform to store procedure¶
Snowflake는 매크로를 지원하지 않으므로 Teradata 매크로는 저장 프로시저로 변환됩니다.
관련 EWIs¶
SSC-EWI-0022: 이 문에 있는 하나 이상의 식별자는 기본적으로 매개 변수로 간주됩니다.
프로시저¶
설명¶
Teradata의 PROCEDURE 문은 Snowflake PROCEDURE 구문으로 변환됩니다.
Teradata PROCEDURE 에 대한 자세한 내용은 여기를 클릭 하십시오.
샘플 소스 패턴¶
프로시저 변환 생성하기¶
SnowConvert 프로시저 헬퍼 리전¶
모든 프로시저에는 SnowConvert 헬퍼 코드라는 리전이 포함되어 있으며, 이는 JavaScript 에서 기본 제공되지 않는 일부 Teradata 기능을 에뮬레이션하는 데 도움이 되는 변수 및 함수 세트입니다. 프로시저 샘플 코드의 단순화를 위해 이 리전은 표시되지 않습니다. EXEC 같이 항상 추가되는 헬퍼도 있고 FETCH, INTO 등과 같이 온디맨드 방식으로 추가되는 헬퍼도 있습니다.
리전 헬퍼 코드는 다음과 같습니다.
// REGION SnowConvert Helpers Code
var HANDLE_NOTFOUND;
var fetch = (count,rows,stmt) => (count && rows.next() && Array.apply(null,Array(stmt.getColumnCount())).map((_,i) => rows.getColumnValue(i + 1))) || [];
var _RS, ROW_COUNT, _ROWS, MESSAGE_TEXT, SQLCODE = 0, SQLSTATE = '00000', ERROR_HANDLERS, ACTIVITY_COUNT = 0, INTO, _OUTQUERIES = [], DYNAMIC_RESULTS = 9;
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg == undefined ? null : arg instanceof Date ? formatDate(arg) : arg;
return arg;
};
var EXEC = function (stmt,binds,noCatch,catchFunction,opts) {
try {
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
ROW_COUNT = _RS.getRowCount();
ACTIVITY_COUNT = _RS.getNumRowsAffected();
HANDLE_NOTFOUND && HANDLE_NOTFOUND(_RS);
if (INTO) return {
INTO : function () {
return INTO();
}
};
if (_OUTQUERIES.length < DYNAMIC_RESULTS) _OUTQUERIES.push(_ROWS.getQueryId());
if (opts && opts.temp) return _ROWS.getQueryId();
} catch(error) {
MESSAGE_TEXT = error.message;
SQLCODE = error.code;
SQLSTATE = error.state;
var msg = `ERROR CODE: ${SQLCODE} SQLSTATE: ${SQLSTATE} MESSAGE: ${MESSAGE_TEXT}`;
if (catchFunction) catchFunction(error);
if (!noCatch && ERROR_HANDLERS) ERROR_HANDLERS(error); else throw new Error(msg);
}
};
var CURSOR = function (stmt,binds,withReturn) {
var rs, rows, row_count, opened = false, resultsetTable = '', self = this;
this.CURRENT = new Object;
this.INTO = function () {
return self.res;
};
this.OPEN = function (usingParams) {
try {
if (usingParams) binds = usingParams;
if (binds instanceof Function) binds = binds();
var finalBinds = binds && binds.map(fixBind);
var finalStmt = stmt instanceof Function ? stmt() : stmt;
if (withReturn) {
resultsetTable = EXEC(finalStmt,finalBinds,true,null,{
temp : true
});
finalStmt = `SELECT * FROM TABLE(RESULT_SCAN('${resultsetTable}'))`;
finalBinds = [];
}
rs = snowflake.createStatement({
sqlText : finalStmt,
binds : finalBinds
});
rows = rs.execute();
row_count = rs.getRowCount();
ACTIVITY_COUNT = rs.getRowCount();
opened = true;
return this;
} catch(error) {
ERROR_HANDLERS && ERROR_HANDLERS(error);
}
};
this.NEXT = function () {
if (row_count && rows.next()) {
this.CURRENT = new Object;
for(let i = 1;i <= rs.getColumnCount();i++) {
(this.CURRENT)[rs.getColumnName(i)] = rows.getColumnValue(i);
}
return true;
} else return false;
};
this.FETCH = function () {
self.res = [];
self.res = fetch(row_count,rows,rs);
if (opened) if (self.res.length > 0) {
SQLCODE = 0;
SQLSTATE = '00000';
} else {
SQLCODE = 7362;
SQLSTATE = '02000';
var fetchError = new Error('There are not rows in the response');
fetchError.code = SQLCODE;
fetchError.state = SQLSTATE;
if (ERROR_HANDLERS) ERROR_HANDLERS(fetchError);
} else {
SQLCODE = 7631;
SQLSTATE = '24501';
}
return self.res && self.res.length > 0;
};
this.CLOSE = function () {
if (withReturn && _OUTQUERIES.includes(resultsetTable)) {
_OUTQUERIES.splice(_OUTQUERIES.indexOf(resultsetTable),1);
}
rs = rows = row_count = undefined;
opened = false;
resultsetTable = '';
};
};
let PROCRESULTS = (...OUTPARAMS) => JSON.stringify([...OUTPARAMS,[..._OUTQUERIES]]);
// END REGION
Teradata
-- Additional Params: -t JavaScript
REPLACE PROCEDURE my_procedure (in param1 VARCHAR(10), OUT param2 BLOB)
dynamic result sets 9
SELECT * FROM table1;
Snowflake
CREATE OR REPLACE PROCEDURE my_procedure (PARAM1 STRING, PARAM2 BINARY /*** SSC-FDM-TD0001 - COLUMN CONVERTED FROM BLOB DATA TYPE ***/)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
EXEC(`SELECT * FROM table1`,[]);
return PROCRESULTS(PARAM2);
$$;
참고: Snowflake의 저장 프로시저 본문은 Javascript 함수로 실행됩니다
If¶
IF 문 의 변환은 다음과 같습니다.
Teradata
IF value = 2 THEN
Snowflake
if(value == 2){
}
대/소문자¶
Case 문 의 변환은 다음과 같습니다.
Teradata
case value
when 0 then
select * from table1
else
update table1 set name = "SpecificValue" where id = value;
end case
Snowflake
switch(value) {
case 0:EXEC(`SELECT * FROM PUBLIC.table1`,[]);
break;
default:EXEC(`UPDATE PUBLIC.table1 set name = "SpecificValue" where id = value`,[]);
break;
}
커서 선언, OPEN, FETCH 및 CLOSE¶
cursor 문 의 변환은 다음과 같습니다.
Teradata
-- Additional Params: -t JavaScript
CREATE PROCEDURE procedure1()
DYNAMIC RESULT SETS 2
BEGIN
-------- Local variables --------
DECLARE sql_cmd VARCHAR(20000) DEFAULT ' ';
DECLARE num_cols INTEGER;
------- Declare cursor with return only-------
DECLARE resultset CURSOR WITH RETURN ONLY FOR firststatement;
------- Declare cursor -------
DECLARE cur2 CURSOR FOR SELECT COUNT(columnname) FROM table1;
-------- Set --------
SET sql_cmd='sel * from table1';
-------- Prepare cursor --------
PREPARE firststatement FROM sql_cmd;
-------- Open cursors --------
OPEN resultset;
OPEN cur1;
-------- Fetch -------------
FETCH cur1 INTO val1, val2;
-------- Close cursor --------
CLOSE cur1;
END;
Snowflake
CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
//------ Local variables --------
var SQL_CMD = ` `;
var NUM_COLS;
var RESULTSET = new CURSOR(() => FIRSTSTATEMENT,[],true);
//----- Declare cursor -------
var CUR2 = new CURSOR(`SELECT COUNT(columnname) FROM table1`,[],false);
//------ Set --------
SQL_CMD = `SELECT * from table1`;
//------ Prepare cursor --------
var FIRSTSTATEMENT = SQL_CMD;
//------ Open cursors --------
RESULTSET.OPEN();
CUR1.OPEN();
//------ Fetch -------------
CUR1.FETCH() && ([val1,val2] = CUR1.INTO());
//------ Close cursor --------
CUR1.CLOSE();
return PROCRESULTS();
$$;
동안¶
while 문 의 변환은 다음과 같습니다.
Teradata
while (counter < 10) do
set counter = counter + 1;
Snowflake¶
while ( counter < 10) {
counter = counter + 1;
}
보안¶
security 문 의 변환은 다음과 같습니다.
Teradata |
Snowflake |
---|---|
SQL SECURITY CREATOR |
EXECUTE AS OWNER |
SQL SECURITY INVOKER |
EXECUTE AS CALLER |
SQL SECURITY DEFINER |
EXECUTE AS OWNER |
FOR-CURSOR-FOR 루프¶
FOR-CURSOR-FOR 루프 의 변환은 다음과 같습니다.
Teradata
-- Additional Params: -t JavaScript
REPLACE PROCEDURE Database1.Proc1()
BEGIN
DECLARE lNumber INTEGER DEFAULT 1;
FOR class1 AS class2 CURSOR FOR
SELECT COL0,
TRIM(COL1) AS COL1ALIAS,
TRIM(COL2),
COL3
FROM someDb.prefixCol
DO
INSERT INTO TempDB.Table1 (:lgNumber, :lNumber, (',' || :class1.ClassCD || '_Ind CHAR(1) NOT NULL'));
SET lNumber = lNumber + 1;
END FOR;
END;
Snowflake
CREATE OR REPLACE PROCEDURE Database1.Proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
var LNUMBER = 1;
/*** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT ***/
for(var CLASS2 = new CURSOR(`SELECT
COL0,
TRIM(COL1) AS COL1ALIAS,
TRIM(COL2),
COL3
FROM
someDb.prefixCol`,[],false).OPEN();CLASS2.NEXT();) {
let CLASS1 = CLASS2.CURRENT;
EXEC(`INSERT INTO TempDB.Table1
VALUES (:lgNumber, :1, (',' || :
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE VARIABLE class1.ClassCD MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
:2 || '_Ind CHAR(1) NOT NULL'))`,[LNUMBER,CLASS1.CLASSCD]);
LNUMBER = LNUMBER + 1;
}
CLASS2.CLOSE();
$$;
참고: Teradata 프로시저에 있는 FOR 루프는 Javascript에서 해당 기능을 에뮬레이션하는 FOR 블록으로 변환됩니다.
문 내에서 참조되는 프로시저 매개 변수 및 변수¶
프로시저의 문에서 참조되는 프로시저 매개 변수 및 변수에 대한 변환은 다음과 같습니다.
Teradata
-- Additional Params: -t JavaScript
REPLACE PROCEDURE PROC1 (param1 INTEGER, param2 VARCHAR(30))
BEGIN
DECLARE var1 VARCHAR(1024);
DECLARE var2 SMALLINT;
DECLARE weekstart date;
set weekstart= '2019-03-03';
set var1 = 'something';
set var2 = 123;
SELECT * FROM TABLE1 WHERE SOMETHING = :param1;
SELECT * FROM TABLE1 WHERE var1 = var1 AND date1 = weekstart AND param2 = :param2;
INSERT INTO TABLE2 (col1, col2, col3, col4, col5) VALUES (:param1, :param2, var1, var2, weekstart);
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROC1 (PARAM1 FLOAT, PARAM2 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
var VAR1;
var VAR2;
var WEEKSTART;
WEEKSTART = `2019-03-03`;
VAR1 = `something`;
VAR2 = 123;
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`SELECT * FROM TABLE1 WHERE SOMETHING = :1`,[PARAM1]);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`SELECT * FROM TABLE1 WHERE :1 = :1 AND date1 = :2 AND RTRIM(param2) = :3`,[VAR1,WEEKSTART,PARAM2]);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`INSERT INTO TABLE2 (col1, col2, col3, col4, col5) VALUES (:1, :2, :3, :4, :5)`,[PARAM1,PARAM2,VAR1,VAR2,WEEKSTART]);
$$;
_참고: 프로시저 매개 변수 또는 프로시저 내부에서 선언된 변수가 변환되어야 하는 Teradata 문 내에서 참조될 때마다 _ 이 참조는 원래 참조의 기능을 유지하기 위해 결과 텍스트에서 이스케이프됩니다.
Leave¶
Javascript에서는 break
를 추가 매개 변수와 함께 사용하여 Teradata LEAVE
점프의 동작을 에뮬레이션할 수 있습니다.
레이블은 Javascript 레이블 문을 사용하여 에뮬레이션할 수도 있습니다.
LEAVE 문 의 변환은 다음과 같습니다.
Teradata
-- Additional Params: -t JavaScript
REPLACE PROCEDURE PROC1 ()
BEGIN
DECLARE v_propval VARCHAR(1024);
DECLARE Cur1 cursor for
Select
propID
from viewName.viewCol
where propval is not null;
LABEL_WHILE:
WHILE (SQLCODE = 0)
DO
IF (SQLSTATE = '02000' )
THEN LEAVE LABEL_WHILE;
END IF;
LABEL_INNER_WHILE:
WHILE (SQLCODE = 0)
DO
IF (SQLSTATE = '02000' )
THEN LEAVE LABEL_INNER_WHILE;
END IF;
END WHILE LABEL_INNER_WHILE;
SELECT * FROM TABLE1;
END WHILE L1;
END;
Snowflake
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
var V_PROPVAL;
var CUR1 = new CURSOR(`SELECT propID from viewName.viewCol
where
propval is not null`,[],false);
LABEL_WHILE: {
while ( SQLCODE == 0 ) {
if (SQLSTATE == `02000`) {
break LABEL_WHILE;
}
LABEL_INNER_WHILE: {
while ( SQLCODE == 0 ) {
if (SQLSTATE == `02000`) {
break LABEL_INNER_WHILE;
}
}
}
EXEC(`SELECT * FROM TABLE1`,[]);
}
}
$$;
프로시저에서 결과 가져오기¶
변환에 대한 설명¶
Teradata에서는 프로시저에서 데이터를 반환하는 두 가지 방법이 있습니다. 첫 번째는 출력 매개 변수를 통해, 두 번째는 Dynamic Result Sets 및 _Cursors_를 통해 수행되며, 다음 예시에서는 두 가지를 모두 보여줍니다. 각 중요 사항은 아래에 설명되어 있습니다.
저장 프로시저에서 데이터를 반환하는 예제¶
Teradata
-- Additional Params: -t JavaScript
REPLACE PROCEDURE Procedure1(OUT P1 INTEGER)
DYNAMIC RESULT SETS 2
BEGIN
DECLARE SQL_CMD,SQL_CMD_1 VARCHAR(20000) DEFAULT ' ';
DECLARE RESULTSET CURSOR WITH RETURN ONLY FOR FIRSTSTATEMENT;
SET SQL_CMD = 'SEL * FROM EMPLOYEE';
PREPARE FIRSTSTATEMENT FROM SQL_CMD;
OPEN RESULTSET;
SET P1 = (SEL CAST(AVG(AGE) AS INTEGER) FROM EMPLOYEE);
END;
Snowflake
CREATE OR REPLACE PROCEDURE Procedure1 (P1 FLOAT)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
var SQL_CMD = ` `;
var SQL_CMD_1 = ` `;
var RESULTSET = new CURSOR(() => FIRSTSTATEMENT,[],true);
SQL_CMD = `SELECT * FROM EMPLOYEE`;
var FIRSTSTATEMENT = SQL_CMD;
RESULTSET.OPEN();
EXEC(`(SELECT CAST(TRUNC(AVG(AGE)) AS INTEGER) FROM EMPLOYEE)`,[]);
var subQueryVariable0;
[subQueryVariable0] = INTO();
P1 = subQueryVariable0;
return PROCRESULTS(P1);
$$;
이 변환된 SQL 에서는 몇 가지 변환이 수행됩니다.
DYNAMIC RESULT SETS 2
정의는DYNAMIC_RESULTS
변수로 변환됩니다.
var DYNAMIC_RESULTS = 2;
WITH RETURN
특성이 있는 커서가 열리면(따라서 쿼리가 실행되면) 해당 쿼리 ID 는 나중에 반환될 수 있도록_ OUTQUERIES
컬렉션에 저장됩니다. 쿼리 ID는 Snowflake 저장 프로시저의 JavaScript API 에서 제공되는getQueryId()
함수로 가져올 수 있습니다.첫 번째 k-query-IDs 만 컬렉션에 저장되며, 여기서 k는
DYNAMIC_RESULTS
변수의 값입니다. 이는 저장 프로시저에서 더 많은 커서가 열려 있어도 첫 번째 k-열린 커서만 반환하는 Teradata의 동작을 에뮬레이션하기 위해 수행됩니다.DECLARE CURSOR WITH RETURN
및PREPARE
의 조합은 다음과 같이 변환됩니다.
var RESULTSET = new CURSOR(() => FIRSTSTATEMENT,[],true);
출력 매개 변수는 프로시저의 반환 문을 통해 지원됩니다. 각 출력 매개 변수의 값과
_OUTQUERIES
컬렉션이 포함된 배열이 생성됩니다.PROCRESULTS
함수는 이 배열의 생성 및 채우기를 처리합니다. 자세한 내용은 PROCRESULTS() 헬퍼를 참조하십시오.
return PROCRESULTS(P1);
저장 프로시저에서 데이터 가져오기 예제¶
프로시저에서 출력 매개 변수와 IDs 쿼리가 반환되는 경우 아래 그림과 같이 두 번째 프로시저가 첫 번째 프로시저를 호출하여 이러한 값을 가져올 수 있습니다.
Teradata
-- Additional Params: -t JavaScript
CREATE PROCEDURE Procedure2()
BEGIN
DECLARE x INTEGER;
CALL Procedure1(x);
END;
Snowflake
CREATE OR REPLACE PROCEDURE Procedure2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
var X;
EXEC(`CALL Procedure1(:1)`,[X]);
$$;
Procedure1
의P1
인자 값이 반환되어X
변수에 저장됩니다.Procedure1
에서 반환된_ OUTQUERIES
는resultset
변수에 저장됩니다.
참고
이 동작은 INOUT 매개 변수에도 적용됩니다.
Known Issues¶
문제가 발견되지 않았습니다.
관련 EWIs¶
SSC-EWI-0022: 이 문에 있는 하나 이상의 식별자는 기본적으로 매개 변수로 간주됩니다.
SSC-EWI-0023: 성능 검토 - 루프에는 삽입, 삭제 또는 업데이트 문이 포함되어 있습니다.
SSC-EWI-0026: 변수에 날짜, 시간 또는 타임스탬프에 대한 형변환이 필요할 수 있습니다.
SSC-FDM-TD0001: SnowConvert 에서 데이터 타입 BLOB 를 찾을 때 이 메시지가 표시됩니다.