2016-04-29 3 views
0

Это моя хранимая процедура:Как получить доступ к параметрам внутри хранимой процедуры Netezza?

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;" 

псевдонима является единственным способом я нашел в Интернете, чтобы сделать это, но я получаю следующее сообщение об ошибке:

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

Как получить доступ к трем «переменные varchar», которые я передаю в хранимую процедуру внутри того же самого?

ответ

0

Вы пытаетесь ссылаться на переменные, помещая $ перед именем, которое недопустимо.

Посмотрите на пример in the docs.

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

Вы должны попробовать

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

Хотя вполне возможно, что значения столбцов не рассосется при использовании этого способа. Если нет, создайте динамический оператор и запустите его.

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

Если вы передаете значения, а не имена столбцов, в качестве параметров:

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

Все еще не работает. Проблема в том, что я должен использовать инструкцию select для вставки. Я знаю, что это работает, если ... INSERT INTO ABC..XYZ VALUES (t1, t2, t3). Однако мне действительно нужно использовать оператор select, потому что моя фактическая вставка что-то вроде этого, INSERT INTO ABC..XYZ (выберите t1, t2, t3, p1, p2, p3 из ABC..PQR limit 10); где t1, t2, t3 исходят из переданных параметров, а p1, p2 и p3 исходят из таблицы PQR. – Macopare

+0

Вы передаете строки, которые нужно вставить, или имена столбцов в процедуру? –

+1

Существуют ли t1, t2 и t3, предназначенные для вставки буквенных значений, в то время как p1, p2 и p3 предназначены для вставки того, что находится в столбцах PQR? Динамическое SQL-решение Джереми должно работать на вас, хотя вы можете использовать quote_ident или quote_literal в зависимости от ваших намерений. – ScottMcG

0

Вот пример аналогичен вашему требованию и его работы. Я использую две таблицу «Tab1» и «» TAB2 с описанием:



    $ 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" 

Ниже приводится код хранимой процедуры, которые я использовал:



    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; 

Надеется, что это поможет!

Смежные вопросы