Oracle存储过程构成了一个问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle存储过程构成了一个问题相关的知识,希望对你有一定的参考价值。
[编辑]编辑代码以反映来自评论的更改
我正在尝试在Oracle数据库中创建一个存储过程的问题。
目标是更新每个具有indiv
列的表。
CREATE OR REPLACE PROCEDURE sp_majUserOnAllK (lastU IN VARCHAR2, newU IN VARCHAR2)
AS
BEGIN
FOR item IN (
select table_name , owner
from all_tab_columns
where column_name = 'INDIV' AND OWNER ='K'
)
LOOP
EXECUTE IMMEDIATE 'UPDATE K.' || item.table_name || ' SET indiv = :newValue WHERE indiv = :oldValue' USING newU, lastU;
END LOOP;
END sp_majUserOnAllK;
exec sp_majUserOnAllK( 'hum','hum');
问题是,当我尝试执行存储过程时,我得到一条没有任何细节的错误消息('无效的SQL')。
我尝试从存储过程中取出代码。在那里,它的工作原理。只有开始变为:
DECLARE
newU NVARCHAR2(50);
lastU NVARCHAR2(50);
req VARCHAR2(100);
CURSOR ctable IS
select table_name , owner from all_tab_columns where column_name = 'INDIV' AND OWNER ='KEXPLOIT';
BEGIN
newU := 'hum';
lastU := 'hum';
FOR item IN ctable
....
就像那样,它完美地工作并完全按照它应该做的去做。
唯一的区别是变量的赋值,我想我的程序声明可能有问题,但我找不到解决方案。编译还可以。
任何的想法 ?
谷歌在“dbeaver exec命令”上进行了五秒钟的搜索,在最初的几次点击中获得了这一点:
https://github.com/dbeaver/dbeaver/issues/749
在其中,我们了解到dbeaver不支持EXEC
。
EXEC
是一个SQL * Plus命令。它不是Oracle SQL,也不是PL / SQL。 SQL * Plus是一种用于与Oracle数据库交互的shell程序;它有自己的语言,不同于SQL和PL / SQL。
SQL Developer和Toad(可能还有其他类似程序)支持(大部分)SQL * Plus,但显然dbeaver(我不熟悉)并不支持。
我上面复制的链接建议使用CALL
命令。请参阅链接以获取示例。
顺便说一句,当我们在SQL * Plus和SQL Developer中使用EXEC
时,在过程调用结束时没有分号。但是,添加一个不必要的分号不会产生错误(SQL * Plus显然足够聪明,可以简单地忽略它)。
您的过程的语法不正确。试试这个。
CREATE OR REPLACE PROCEDURE sp_majUserOnAllK (lastU IN VARCHAR2, newU IN VARCHAR2)
IS
req VARCHAR2(100);
BEGIN
FOR item IN (select table_name , owner from all_tab_columns where column_name = 'INDIV' AND OWNER ='K')
LOOP
req := 'UPDATE K.' || item.table_name || ' SET indiv = :newValue WHERE indiv = :oldValue';
EXECUTE IMMEDIATE req USING newU, lastU;
END LOOP;
-- return 1; -- note: procedures do not return values
END;
/
以上是关于Oracle存储过程构成了一个问题的主要内容,如果未能解决你的问题,请参考以下文章