首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Netezza中的光标操作

Netezza中的光标操作
EN

Stack Overflow用户
提问于 2015-04-25 19:21:35
回答 2查看 4.5K关注 0票数 2
代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE SP_NEW_PROCEDURE1( )
RETURNS REFTABLE(employees)
LANGUAGE NZPLSQL AS
BEGIN_PROC
  DECLARE

    l_conditions  varchar(1000);
    p_rec         RECORD;

BEGIN

    FOR P_REC IN  select empid, mgrid, empname, salary  from employees where mgrid = 7 
    LOOP


            l_conditions  :=  'insert into  '  || 
                              REFTABLENAME     || 
                              '  VALUES ('     || 
                              P_REC.EMPID      || 
                              ','              || 
                              P_REC.MGRID      || 
                              ','              || 
                              P_REC.EMPNAME    || 
                              ','              || 
                              P_REC.SALARY     || 
                              '  ) ; ' ;

     execute immediate l_conditions; 

      l_conditions  := ' ';

    END LOOP;      
    RETURN REFTABLE;
END;
END_PROC;

当我运行以下命令时:

代码语言:javascript
复制
select SP_NEW_PROCEDURE1()

我得到了错误:

代码语言:javascript
复制
ERROR [01000] NOTICE:  Error occurred while executing PL/pgSQL function SP_NEW_PROCEDURE1
ERROR [01000] NOTICE:  line 24 at execute statement
ERROR [42S22] ERROR:  Attribute 'DAN' not found

有人能帮我吗?...thanks怎么了?

EN

回答 2

Stack Overflow用户

发布于 2015-04-27 04:39:47

这与游标本身无关,而与构建动态SQL字符串的方式有关。

在Netezza存储过程中构建动态SQL时,可以使用quote_ident和quote_literal助手函数让系统知道您是在向它传递文字,还是向它传递标识符。在online documentation here中有一个例子。本质上,他们所做的就是找出所需的转义引用符号。

由于您试图将存储在P_REC记录的列中的值放入insert语句的值部分,因此可以按如下方式使用quote_literal:

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE SP_NEW_PROCEDURE1( )
RETURNS REFTABLE(employees)
LANGUAGE NZPLSQL AS
BEGIN_PROC
  DECLARE

l_conditions  varchar(1000);
p_rec         RECORD;

BEGIN

FOR P_REC IN  select empid, mgrid, empname, salary  from employees where mgrid = 7 
LOOP


        l_conditions  :=  'insert into  '  || 
                          REFTABLENAME     || 
                          '  VALUES ('     || 
                          quote_literal(P_REC.EMPID)  || 
                          ','              || 
                          quote_literal(P_REC.MGRID)    || 
                          ','              || 
                          quote_literal(P_REC.EMPNAME)   || 
                          ','              || 
                          quote_literal(P_REC.SALARY )    || 
                          '  ) ; ' ;

 execute immediate l_conditions; 

  l_conditions  := ' ';

END LOOP;      
RETURN REFTABLE;
END;
END_PROC;

也就是说,在Netezza这样的MPP数据库中,使用游标循环记录以一次插入一行的效率非常低。假设这个问题是您提出的关于使用递归CTE来探索层次结构的替代方法的问题的后续问题,通常循环没有什么问题,但请尽量避免逐条记录地进行循环。这是一个利用系统的MPP特性的版本。根据记录,如果您要将结果集返回到REFTABLE,那么您唯一的选择就是动态SQL。

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE SP_NEW_PROCEDURE1( )
RETURNS REFTABLE(employees)
LANGUAGE NZPLSQL AS
BEGIN_PROC
  DECLARE

    l_conditions  varchar(1000);
    p_rec         RECORD;

BEGIN

--    FOR P_REC IN  select empid, mgrid, empname, salary  from employees where mgrid = 7 
--    LOOP


            l_conditions  :=  'insert into  '  || 
                              REFTABLENAME     || 
                              '  select empid, mgrid, empname, salary  from employees where mgrid = 7 ; ' ;

     execute immediate l_conditions; 

      l_conditions  := ' ';

--    END LOOP;      
    RETURN REFTABLE;
END;
END_PROC;
票数 1
EN

Stack Overflow用户

发布于 2015-04-25 20:16:25

我怀疑您正在构建一个旨在插入文字' DAN‘的查询,但该查询不包括所需的引号,因此它引用了DAN-因此优化器正在尝试查找该名称的属性。

因此,修复方法是在构建SQL insert语句时包含引号,或者(最好)只使用静态SQL来插入值,而不是立即执行。

如果有疑问,请始终查看数据,因为如果您检查了l_conditions的值,这一点可能对您来说是显而易见的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29864477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档