2016-04-29 11 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;" 

ALIAS FORこれを行うために、私はインターネット上で見つけた唯一の方法ですが、私は次のエラーを取得:私は3にアクセスするにはどうすればよい

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 (ABC..PQR limit 10からt1、t2、t3、p1、p2、p3を選択します)です。ここで、t1、t2、t3は渡されたパラメータに由来し、p1、p2およびp3はテーブルPQRに由来する。 – Macopare

+0

プロシージャに挿入する文字列や列名を渡していますか? –

+1

p1、p2、p3はすべてPQRの列にあるものを挿入する意味で、t1、t2、t3はすべてリテラル値を挿入するものですか?あなたの意図に応じてquote_identまたはquote_literalを使用することもできますが、Jeremyの動的SQLソリューションが有効です。 – ScottMcG

0

はあなたの条件およびその作業と同様の例です。私は、以下の説明で二つのテーブル「TAB1」と「TAB2」を使用しています:これは役立つ



    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; 

希望:



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

後は、私が使用したスト​​アドプロシージャのコードです!

関連する問題