Oracle存储过程构成了一个问题

时间:2018-02-27 13:54:10

标签: oracle stored-procedures dbeaver

[编辑]编辑代码以反映来自评论的更改

我在尝试在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
            ....

就像那样,它完美地运作并完全按照它应该做的那样。

唯一的区别是变量的分配,我想我的程序声明可能有问题,但我无法找到解决方案。编译还可以。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您的程序语法不正确。试试这个。

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;
/

答案 1 :(得分:1)

谷歌搜索" 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显然足够聪明,可以忽略它)。