0

当我跑

SELECT COUNT(*) 
  INTO l_entry_found 
  FROM hera.hera_user@iam 
 WHERE username = docm.eb_key;

不立即执行它就可以工作。

execute immediate'
      SELECT COUNT(*) INTO l_entry_found FROM hera.hera_user@iam WHERE 
      username = docm.eb_key;';

然而抛出一个ora-00933.

可能是什么问题,我该如何解决?提前致谢!

4

3 回答 3

2

您不能select into在动态 SQL 中使用,也不需要分号

declare
  l_entry number(10);
begin

  execute immediate'
        SELECT COUNT(*) FROM hera.hera_user@iam WHERE 
        username = '''||docm.eb_key||'''' INTO l_entry;
end;
于 2018-09-07T13:37:41.793 回答
1

你有一些问题;说你有一张像

create table someTable(userName varchar2(100))

和类似的代码:

declare
    someVariable    varchar2(100);
    l_entry_found   number;
begin
    someVariable := 'someName';
    --
    SELECT COUNT(*)
    INTO l_entry_found
    FROM someTable
    WHERE username = someVariable;
end;

如果要切换到动态 SQL,则需要

  • 删除分号
  • 使用绑定变量来传递你的参数
  • 移动INTO外部动态部分

您的代码可能是:

declare
    someVariable    varchar2(100);
    l_entry_found   number;
begin
    someVariable := 'someName';
    --
    execute immediate 
    'SELECT COUNT(*)
    FROM someTable
    WHERE username = :bindVar'
    into l_entry_found
    using someVariable;
end;

在这里,我假设您有充分的理由切换到动态 SQL,例如,您的表名可能会根据某些参数而更改;如果没有,纯 SQL 就足以完成您的任务。

于 2018-09-07T13:41:42.527 回答
0

EXECUTE IMMEDIATE 语句执行动态 SQL 语句或匿名 PL/SQL 块。您可以使用它来发出不能直接在 PL/SQL 中表示的 SQL 语句,或者在您事先不知道所有表名、WHERE 子句等的情况下构建语句

在此处输入图像描述

继续你的问题

-- Case using 1 output column 'COUNT(*)', 1 filter variable 'eb_key'
DECLARE
  --
  eb_key VARCHAR2(100) := 'something';
  l_entry_found number;
  --
BEGIN 
  execute immediate 'SELECT COUNT(*) FROM hera.hera_user@iam WHERE username = :eb_key;' USING eb_key INTO l_entry_found;
END;

-- Case using 2 output column 'COUNT(*)', 3 filter variable 'eb_key'
DECLARE
  --
  eb_column1 VARCHAR2(100) := 'something';
  eb_column2 VARCHAR2(100) := 'something';
  l_entry_found1 number;
  l_entry_found2 number;
  --
BEGIN 
  execute immediate 'SELECT column1, column2 FROM hera.hera_user@iam WHERE username = :eb_1 AND lastname = :eb_2;' USING eb_column1, eb_column2 INTO l_entry_found1,l_entry_found2;
END;
于 2018-09-09T10:28:00.113 回答