【问题标题】:How to access parameters inside a Netezza stored procedure?如何访问 Netezza 存储过程中的参数?
【发布时间】:2016-04-29 18:09:05
【问题描述】:

这是我的存储过程:

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 是我在互联网上找到的唯一方法,但我收到以下错误:

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 变量”?

【问题讨论】:

    标签: shell stored-procedures netezza nzsql


    【解决方案1】:

    这是一个类似于您的要求及其工作的示例。我正在使用两个表“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;
    
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您试图通过在名称前添加$ 来引用变量,这是无效的。

      看例子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;
      

      【讨论】:

      • 还是不行。问题是我必须使用 select 语句来插入。我知道如果这样做会起作用.. INSERT INTO ABC..XYZ 值(t1,t2,t3)。但是,我实际上需要使用 select 语句,因为我的实际插入是这样的,INSERT INTO ABC..XYZ (select t1, t2, t3, p1, p2, p3 from ABC..PQR limit 10);其中 t1、t2、t3 来自传递的参数,p1、p2 和 p3 来自表 PQR。
      • 您是否将要插入的字符串或列名传递给过程?
      • t1、t2 和 t3 是否都用于插入文字值,而 p1、p2 和 p3 是否都用于插入 PQR 列中的任何内容? Jeremy 的动态 SQL 解决方案应该适合您,但您可能希望根据自己的意图使用 quote_ident 或 quote_literal。
      猜你喜欢
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      相关资源
      最近更新 更多