2016-04-29 8 views
0

Das ist meine gespeicherte Prozedur:Zugriff auf Parameter in einer gespeicherten Netezza-Prozedur?

nzsql -u user -pw pass -c "CREATE OR REPLACE PROCEDURE INSERT_LOGIC(varchar(50),varchar(20),varchar(40)) RETURNS BOOL LANGUAGE NZPLSQL AS BEGIN_PROC 
DECLARE 
t1 ALIAS FOR $1; 
t2 ALIAS FOR $2; 
t3 ALIAS FOR $3; 
BEGIN 

INSERT INTO ABC..XYZ 
(select '$t1','$t2','$t3' from ABC..PQR limit 10); 

END; 
END_PROC;" 

Die ALIAS FOR ist der einzige Weg, die ich im Internet gefunden, dies zu tun, aber ich erhalte die folgenden Fehler:

NOTICE: plpgsql: ERROR during compile of INSERT_LOGIC near line 3 
ERROR: syntax error, unexpected ERROR, expecting VARIABLE or WORD at or near "t1Stuff" 

Wie greife ich auf die drei "Varchar-Variablen", die ich an die gespeicherte Prozedur innerhalb derselben übergeben?

Antwort

0

Sie versuchen, Variablen zu verweisen, indem ein $ vor dem Namen setzen, die nicht gültig ist.

Blick auf das Beispiel in the docs.

DECLARE 
    logtxt ALIAS FOR $1; 
    curtime timestamp; 
BEGIN 
    curtime := 'now()'; 
    INSERT INTO logtable VALUES (logtxt, curtime); 
    RETURN curtime; 
END 

sollten Sie

versuchen
INSERT INTO ABC..XYZ 
(select t1, t2, t3 from ABC..PQR limit 10); 

Obwohl es, dass die Spaltenwerte, wenn auf diese Weise benutzt lösen nicht möglich ist. Wenn nicht, erstellen Sie eine dynamische Anweisung und führen Sie sie stattdessen aus.

declare sql varchar; 
sql := 'insert into abc..xyz select ' || t1 || ',' || t2 || ',' || t3 || ' from abc..pqr limit 10;' 
execute immediate sql; 

Wenn Sie Werte sind vorbei, keine Spaltennamen als Parameter:

declare sql varchar; 
sql := 'insert into abc..xyz select ''' || t1 || ''',''' || t2 || ''',''' || t3 || ''' from abc..pqr limit 10;' 
execute immediate sql; 
+0

noch nicht funktioniert. Das Problem ist, dass ich die select-Anweisung zum Einfügen verwenden muss. Ich weiß, es funktioniert, wenn .. INSERT IN ABC..XYZ WERTE (t1, t2, t3). Ich brauche aber tatsächlich die Select-Anweisung cos meinen tatsächlichen Einsatz zu verwenden, ist so etwas, INSERT INTO ABC..XYZ (wählen T1, T2, T3, P1, P2, P3 von ABC..PQR Grenze 10); wobei t1, t2, t3 von den übergebenen Parametern kommen und p1, p2 und p3 von der Tabelle PQR kommen. – Macopare

+0

Gibst Sie Zeichenfolgen auf das Verfahren eingeführt oder Spaltennamen werden? –

+1

Sind T1, T2 und T3 alle wörtlichen Werte einfügen soll, während P1, P2 und P3 alle, was in den Spalten von PQR ist einfügen sollen? Die dynamische SQL-Lösung von Jeremy sollte für Sie funktionieren, obwohl Sie je nach Ihren Absichten auch quote_ident oder quote_literal verwenden möchten. – ScottMcG

0

Hier ist ein Beispiel ähnlich Ihre Anforderung und seine Arbeiten. Ich bin mit zwei Tabellen 'tab1' und 'tab2' mit folgenden Beschreibung:



    $ nzsql -d test -c "\d tab1" 
         Table "TAB1" 
    Attribute |  Type  | Modifier | Default Value 
    -----------+---------------+----------+--------------- 
    COL1  | INTEGER  |   | 
    COL2  | CHARACTER(10) |   | 
    COL3  | INTEGER  |   | 
    Distributed on hash: "COL1" 

    $ nzsql -d test -c "\d tab2" 
         Table "TAB2" 
    Attribute |  Type  | Modifier | Default Value 
    -----------+---------------+----------+--------------- 
    C1  | INTEGER  |   | 
    C2  | CHARACTER(10) |   | 
    C3  | INTEGER  |   | 
    Distributed on hash: "C1" 

Es folgt der Code der gespeicherten Prozedur, die ich verwenden:



    CREATE OR REPLACE PROCEDURE INSERT_LOGIC(varchar(50),varchar(20),varchar(40)) 
     RETURNS BOOL 
     LANGUAGE NZPLSQL 
     AS 
    BEGIN_PROC 
     DECLARE 
     num_args int4; 
     sql char(100); 
     t1 ALIAS FOR $1; 
     t2 ALIAS FOR $2; 
     t3 ALIAS FOR $3; 
     BEGIN 
     num_args := PROC_ARGUMENT_TYPES.count; 
     RAISE NOTICE 'Number of arguments: %', num_args; 
     sql := 'INSERT INTO tab2 SELECT ' || t1 || ',' || t2 || ',' || t3 || ' FROM tab1 LIMIT 10 '; 
     RAISE NOTICE 'SQL Statement: %', sql; 
     EXECUTE IMMEDIATE sql; 
     END; 
    END_PROC; 

Hope this helfen!