如何在 oracle pl/sql 语句中声明查询?

Posted

技术标签:

【中文标题】如何在 oracle pl/sql 语句中声明查询?【英文标题】:How do I declare a query in an oracle pl/sql statement? 【发布时间】:2016-01-19 21:28:17 【问题描述】:

我对 Oracle 还很陌生,但我的任务是编写此声明。

BEGIN
FOR partition IN 1..32 LOOP
    lQuery := 'UPDATE CORE.tbl PARTITION(tbl' || LPAD(partition, 2, '0') || ') SET p = NULL '
           || 'WHERE p IS NOT NULL';

    EXECUTE IMMEDIATE lQuery;
END LOOP;
END;

但是,我收到以下错误

Error starting at line 1 in command:
BEGIN
FOR partition IN 1..32 LOOP
    lQuery := 'UPDATE CORE.user_login PARTITION(user_login' || LPAD(partition, 2, '0') || ') SET password_md5 = NULL '
           || 'WHERE password_md5 IS NOT NULL';

    EXECUTE IMMEDIATE lQuery;
END LOOP;
END;
Error report:
ORA-06550: line 3, column 5:
PLS-00201: identifier 'LQUERY' must be declared
ORA-06550: line 3, column 5:
PL/SQL: Statement ignored
ORA-06550: line 6, column 23:
PLS-00201: identifier 'LQUERY' must be declared
ORA-06550: line 6, column 5:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

当我尝试运行它时。我知道这可能是因为没有声明lQuery,但是在线谷歌搜索向我展示了声明某种类型的变量的示例,例如(整数、varchar 等),但没有一个显示如何将查询声明为该语句预计。

【问题讨论】:

您的lQuery 只是一个变量,应该被视为一个变量。它需要被声明(作为一些类似字符串的值,例如VARCHAR2)。 您确定需要遍历分区吗?使用名为USER_LOGIN 的表,您的系统应该能够在一个语句中更新整个内容。 (另外,+1 用于删除不安全的 M5 密码哈希!) What am I doing wrong in this Oracle SQL Update query that's supposed run across partitions?的可能重复 【参考方案1】:

您的语句可以简单地声明为 varchar2。例如:

declare
  vsql varchar2(1000);
  n   integer;
begin
  vsql := 'select 1 from dual';
  execute immediate vsql into n;
  dbms_output.put_line(n);
end;

【讨论】:

以上是关于如何在 oracle pl/sql 语句中声明查询?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器

oracle-PL/SQL1

Oracle 游标简介

oracle游标的使用

SQL 查询的 SELECT 子句中 Oracle PL/SQL 语句的延迟评估

在 pl/SQL 中继续声明? [复制]