SnowConvert: Teradata SQL zu JavaScript (Prozeduren)¶
GET DIAGNOSTICS EXCEPTION¶
Beschreibung ¶
GET DIAGNOSTICS ruft Informationen über Erfolgs-, Ausnahme- oder Abschlussbedingungen aus dem Diagnosebereich ab.
Weitere Informationen zu GET DIAGNOSTICS in Teradata finden Sie hier.
GET DIAGNOSTICS
{
[ EXCEPTION < condition_number >
[ < parameter_name | variable_name > = < information_item > ]...
]
|
[ < parameter_name | variable_name > = < information_item > ]...
}
Bemerkung
Einige Teile des Ausgabecodes werden aus Gründen der Übersichtlichkeit weggelassen.
Beispielhafte Quellcode-Muster ¶
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;
$$;
Probleme kennen¶
Nicht unterstützte BEDINGUNGSATTRIBUT-Anweisungen
CLASS_ORIGIN
CONDITION_IDENTIFIER
CONDITION_NUMBER
MESSAGE_LENGTH
RETURNED_SQLSTATE
SUBCLASS_ORIGIN
Macros¶
Beschreibung¶
Die MACRO-Anweisung von Teradata wird in die MACRO-Syntax von Snowflake übersetzt.
Weitere Informationen zu MACRO in Teradata finden Sie hier.
Bemerkung
Einige Teile des Ausgabecodes werden aus Gründen der Übersichtlichkeit weggelassen.
Beispielhafte Quellcode-Muster¶
Makrotransformation erstellen¶
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;
$$;
Bekannte Probleme¶
1. Macro transform to store procedure¶
Das Teradata-Makro wird in eine gespeicherte Prozedur transformiert, da Snowflake keine Makros unterstützt.
Zugehörige EWIs¶
[SSC-EWI-0022](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0022): Ein oder mehrere Bezeichner in dieser Anweisung wurden standardmäßig als Parameter betrachtet.
Prozeduren¶
Beschreibung¶
Die PROCEDURE-Anweisung von Teradata wird in die PROCEDURE-Syntax von Snowflake übersetzt.
Weitere Informationen zu Teradata PROCEDURE finden Sie hier.
Beispielhafte Quellcode-Muster¶
Transformation von Create Procedure¶
Bemerkung
SnowConvert Hilfscode wurde aus dem Beispiel entfernt. Sie finden sie hier.
Einige Teile des Ausgabecodes werden aus Gründen der Übersichtlichkeit weggelassen.
Hilfebereich für SnowConvert-Prozeduren¶
Alle Prozeduren enthalten einen Bereich mit der Bezeichnung SnowConvert-Hilfsfunktionscode. Dabei handelt es sich um eine Reihe von Variablen und Funktionen, die dazu beitragen, einige Teradata-Funktionen zu emulieren, die nicht nativ in JavaScript enthalten sind. Der Einfachheit halber wird dieser Bereich im Beispielcode der Prozeduren nicht angezeigt. Einige Hilfsfunktionen werden immer hinzugefügt, wie z. B. EXEC und andere wie FETCH, INTO, usw. werden bei Bedarf hinzugefügt.
Der Code für die Hilfsfunktion des Bereichs lautet wie folgt:
// 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);
$$;
_Anmerkung: Der Body der gespeicherten Prozedur wird in Snowflake als Javascript-Funktion ausgeführt
If¶
Die Transformation für die IF-Anweisung lautet:
Teradata
IF value = 2 THEN
Snowflake
if(value == 2){
}
Case¶
Die Transformation für die CASE-Anweisung lautet:
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;
}
Cursordeklaration, OPEN, FETCH und CLOSE¶
Die Transformation für CURSOR-Anweisungen lautet:
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¶
Die Transformation für die WHILE-Anweisung lautet:
Teradata
while (counter < 10) do
set counter = counter + 1;
Snowflake¶
while ( counter < 10) {
counter = counter + 1;
}
Sicherheit¶
Die Transformation für Sicherheitsanweisungen ist:
Teradata |
Snowflake |
---|---|
SQL SECURITY CREATOR |
EXECUTE AS OWNER |
SQL SECURITY INVOKER |
EXECUTE AS CALLER |
SQL SECURITY DEFINER |
EXECUTE AS OWNER |
FOR-CURSOR-FOR-Schleife¶
Die Transformation für die FOR-CURSOR-FOR-Schleife ist:
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();
$$;
_Anmerkung: Die in der Teradata-Prozedur vorhandene FOR -Schleife wird in einen FOR-Block in Javascript transformiert, der ihre Funktionalität emuliert
Prozedurparameter und Variablen, auf die innerhalb von Anweisungen verwiesen wird¶
Die Transformation für die Parameter und Variablen der Prozedur, auf die innerhalb der Anweisungen der Prozedur verwiesen wird, lautet:
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]);
$$;
Anmerkung: Wann immer ein Prozedurparameter oder eine innerhalb der Prozedur deklarierte Variable in einer Teradata-Anweisung referenziert wird, die konvertiert werden muss, wird diese Referenz aus dem resultierenden Text ausgeblendet, um die Funktionalität der ursprünglichen Referenz zu erhalten.
Leave¶
In Javascript ist es möglich, break
mit einem zusätzlichen Parameter zu verwenden und so die Verhaltensweise eines Teradata LEAVE
-Sprungs zu emulieren.
Labels können auch durch die Verwendung von LABELED-Anweisungen in Javascript emuliert werden.
Die Transformation für die LEAVE-Anweisung lautet:
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`,[]);
}
}
$$;
Ergebnisse aus Prozeduren abrufen¶
Beschreibung der Übersetzung¶
In Teradata gibt es zwei Möglichkeiten, Daten aus einer Prozedur zurückzugeben. Die erste ist durch Ausgabeparameter und die zweite durch Dynamische Resultsets und Cursors. Beide werden im folgenden Beispiel gezeigt. Jeder wichtige Punkt wird im Folgenden erläutert.
Beispiel für die Rückgabe von Daten aus einer gespeicherten Prozedur¶
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);
$$;
In diesem konvertierten SQL finden mehrere Konvertierungen statt:
Die Definition
DYNAMIC RESULT SETS 2
wird in eine VariableDYNAMIC_RESULTS
umgewandelt.
var DYNAMIC_RESULTS = 2;
Wenn ein Cursor mit dem Attribut
WITH RETURN
geöffnet wird (und damit eine Abfrage ausgeführt wird), wird seine Abfrage-ID in der Sammlung_ OUTQUERIES
gespeichert, um später zurückgegeben zu werden. Die Abfrage-ID wird mit der FunktiongetQueryId()
ermittelt, die in der Funktion JavaScript API für gespeicherte Prozeduren in Snowflake bereitgestellt wird.Nur die ersten k Abfragen-IDs werden in der Sammlung gespeichert, wobei k der Wert der Variable
DYNAMIC_RESULTS
ist. Damit wird die Verhaltensweise von Teradata emuliert, das nur die ersten k geöffneten Cursor zurückgibt, auch wenn in der gespeicherten Prozedur mehr geöffnet sind.Die Kombination von
DECLARE CURSOR WITH RETURN
mitPREPARE
wird übersetzt mit:
var RESULTSET = new CURSOR(() => FIRSTSTATEMENT,[],true);
Die Ausgabeparameter werden über die RETURN-Anweisung der Prozedur unterstützt. Es wird ein Array erstellt, das die Werte der einzelnen Ausgabeparameter und die Sammlung
_OUTQUERIES
enthält. Die FunktionPROCRESULTS
kümmert sich um die Erstellung und Befüllung dieses Arrays. Siehe PROCRESULTS() Hilfsfunktion für weitere Informationen.
return PROCRESULTS(P1);
Beispiel für den Abruf von Daten aus einer gespeicherten Prozedur.¶
Wenn die Ausgabeparameter und die Abfrage-IDs von einer Prozedur zurückgegeben werden, könnte eine zweite Prozedur die erste aufrufen, um diese Werte zu erhalten, wie unten gezeigt:
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]);
$$;
Der Wert des Arguments
P1
vonProcedure1
wird zurückgegeben und in der VariablenX
gespeichert.Die von
Procedure1
zurückgegebenen_ OUTQUERIES
werden in der Variablenresultset
gespeichert.
Bemerkung
Diese Verhaltensweise gilt auch für die INOUT-Parameter.
Bekannte Probleme¶
Es wurden keine Probleme gefunden.
Zugehörige EWIs¶
[SSC-EWI-0022](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0022): Ein oder mehrere Bezeichner in dieser Anweisung wurden standardmäßig als Parameter betrachtet.
[SSC-EWI-0023](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0023): Leistungsüberprüfung - Eine Schleife enthält eine Insert-, DELETE- oder UPDATE-Anweisung.
[SSC-EWI-0026](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0026): Die Variable kann eine Umwandlung in ein Datum, eine Zeit oder einen Zeitstempel erfordern.
[SSC-FDM-TD0001](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/teradataFDM. md#ssc-fdm-td0001): Diese Meldung wird angezeigt, wenn SnowConvert einen BLOB-Datentyp findet.