首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-00933:使用execute immediate时SQL命令未正确结束

ORA-00933:使用execute immediate时SQL命令未正确结束
EN

Stack Overflow用户
提问于 2018-09-07 21:27:13
回答 3查看 916关注 0票数 0

当我跑的时候

代码语言:javascript
复制
SELECT COUNT(*) 
  INTO l_entry_found 
  FROM hera.hera_user@iam 
 WHERE username = docm.eb_key;

如果没有execute immediate,它就可以工作。

代码语言:javascript
复制
execute immediate'
      SELECT COUNT(*) INTO l_entry_found FROM hera.hera_user@iam WHERE 
      username = docm.eb_key;';

但是抛出了一个ora-00933

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

EN

回答 3

Stack Overflow用户

发布于 2018-09-07 21:37:42

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

代码语言:javascript
复制
declare
  l_entry number(10);
begin

  execute immediate'
        SELECT COUNT(*) FROM hera.hera_user@iam WHERE 
        username = '''||docm.eb_key||'''' INTO l_entry;
end;
票数 2
EN

Stack Overflow用户

发布于 2018-09-07 21:41:43

您有一些问题;假设您有一个表,例如

代码语言:javascript
复制
create table someTable(userName varchar2(100))

代码如下所示:

代码语言:javascript
复制
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移出动态部分

你的代码可以是:

代码语言:javascript
复制
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对于您的任务就足够好了。

票数 1
EN

Stack Overflow用户

发布于 2018-09-09 18:28:00

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

继续你的问题

代码语言:javascript
复制
-- 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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52223555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档