Oracle 存储过程构成问题
Oracle Stored Procedure posing a prob
[编辑]编辑代码以反映来自评论的更改
我尝试在 Oracle 数据库中创建的存储过程之一有问题。
目标是更新每个 table 有一个 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');
问题是,当我尝试执行存储过程时,我收到一条没有任何详细信息的错误消息 ('non valid 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
....
就像那样,它完美地工作并且完全按照它应该做的去做。
由于唯一的区别是变量的赋值,我想我的过程声明可能有问题,但我找不到解决方案。编译没问题。
有什么想法吗?
您的程序语法不正确。试试这个。
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;
/
A five-second Google 在 "dbeaver exec command" 上的搜索在前几个命中中提出了这个:
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(我不熟悉)不支持。
我在上面复制的 link 建议改用 CALL
命令。有关示例,请参阅 link。
顺便说一句,当我们在SQL*Plus 和SQL Developer 中使用EXEC
时,过程调用末尾没有分号。但是,添加不必要的分号不会引发错误(SQL*Plus 显然足够聪明,可以简单地忽略它)。
[编辑]编辑代码以反映来自评论的更改
我尝试在 Oracle 数据库中创建的存储过程之一有问题。
目标是更新每个 table 有一个 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');
问题是,当我尝试执行存储过程时,我收到一条没有任何详细信息的错误消息 ('non valid 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
....
就像那样,它完美地工作并且完全按照它应该做的去做。
由于唯一的区别是变量的赋值,我想我的过程声明可能有问题,但我找不到解决方案。编译没问题。
有什么想法吗?
您的程序语法不正确。试试这个。
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;
/
A five-second Google 在 "dbeaver exec command" 上的搜索在前几个命中中提出了这个:
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(我不熟悉)不支持。
我在上面复制的 link 建议改用 CALL
命令。有关示例,请参阅 link。
顺便说一句,当我们在SQL*Plus 和SQL Developer 中使用EXEC
时,过程调用末尾没有分号。但是,添加不必要的分号不会引发错误(SQL*Plus 显然足够聪明,可以简单地忽略它)。