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

Plsql ORA-00933:使用execute immediate时SQL命令未正确结束,plsql,ora-00933,Plsql,Ora 00933,当我跑的时候 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;'; 但是会抛出一个

当我跑的时候

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


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

在动态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;

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

declare
  l_entry number(10);
begin

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

你有一些问题;假设你有一张像这样的桌子

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,你需要

  • 删除分号
  • 使用绑定变量传递参数
  • 移动到动态零件外部的
您的代码可以是:

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就足以完成您的任务。

您有一些问题;假设你有一张像这样的桌子

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,你需要

  • 删除分号
  • 使用绑定变量传递参数
  • 移动到动态零件外部的
您的代码可以是:

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就足以完成任务。

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

继续你的问题
executeimmediate语句执行动态SQL语句或匿名PL/SQL块。您可以使用它来发出无法在PL/SQL中直接表示的SQL语句,或者在不知道所有表名、where子句的情况下构建语句,等等

继续你的问题
您不能在动态SQL中使用
选择进入
,您还需要删除
在SQL字符串中。您不能在动态SQL中使用
选择进入
,您还需要删除
是否也需要在其中定义execute immediate中的每个变量?由于我现在在docm.eb_键上得到一个无效标识符,如果您选择了多个列作为结果,那么您需要为每个列定义一个变量执行立即数中的每个变量也需要在那里定义吗?由于我现在在docm.eb_键上得到一个无效的标识符,如果您选择了一个以上的列作为结果,那么您需要为每个列设置一个变量。代码将安装在我们的产品中,但仅在TestServer上使用。DB链接。@iam在生产环境中不存在,因此如果没有动态SQL,则会导致生产环境无效。然而,我在这一点上的主要问题是,我需要一个动态SQL内部的循环变量,我不能在那里使用它。整个过程只是一个小的休眠过程,除非等待一些数据到达@iam DB,否则什么都不做。如果我的问题没有解决方法,也许我会用硬连线等待10分钟来代替它;程序检查#docm是l#U条目#U发现编号;l_eb_key varchar2(10);开始docm in(从tst migr$eb_docm中选择eb_键)循环l_eb_键:=docm.eb_键;从hera.hera执行立即“选择计数(*)_user@iam其中username=l_eb_key'进入找到的l_条目;如果l_entry_found=0且l_cnt<10,则dbms_lock.sleep(10);l_cnt:=l_cnt+1;检查#docm;如果结束;端环;结束检查#docm;开始检查#docm;结束检查#赫拉;该代码将安装在我们的产品中,但仅在TestServer上使用。DB链接。@iam在生产环境中不存在,因此如果没有动态SQL,则会导致生产环境无效。然而,我在这一点上的主要问题是,我需要一个动态SQL内部的循环变量,我不能在那里使用它。整个过程只是一个小的休眠过程,除非等待一些数据到达@iam DB,否则什么都不做。如果我的问题没有解决方法,也许我会用硬连线等待10分钟来代替它;程序检查#docm是l#U条目#U发现编号;l_eb_key varchar2(10);开始docm in(从tst migr$eb_docm中选择eb_键)循环l_eb_键:=docm.eb_键;从hera.hera执行立即“选择计数(*)_user@iam其中username=l_eb_key'进入找到的l_条目;如果l_entry_found=0且l_cnt<10,则dbms_lock.sleep(10);l_cnt:=l_cnt+1;检查#docm;如果结束;端环;结束检查#docm;开始检查#docm;结束检查#赫拉;