如何在 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-分支/循环/游标/异常/存储/调用/触发器