动态 Oracle 错误

Posted

技术标签:

【中文标题】动态 Oracle 错误【英文标题】:Dyanamic Oracle Error 【发布时间】:2014-07-03 23:37:10 【问题描述】:

从内部异常开始和结束得到错误“ORA-00905 missing keyword”;知道吗? 根据 deptno 传递所有表名(动态) 内部开始抛出该错误。 从内部异常开始和结束收到错误“ORA-00905 missing keyword”;知道吗? 根据 deptno 传递所有表名(动态) 内部开始抛出该错误。

enter code here


declare
  type deptcursor is ref cursor;
  c1 deptcursor;
  v_records abc%rowtype;
begin
  if deptno=10
    v_table=abc;
    v_table1=abc1;
  elsif deptno=20
    v_table=xyz;
    v_table1=xyz1;
  end if;

  v_cursor= 'select * from '||v_table||'';

  begin
    -- issue loop
    OPEN C1 FOR v_cursor;

    LOOP
      FETCH C1
        INTO v_records.column1,v_records.column2,v_records.column3;

      EXIT WHEN C1%NOTFOUND; 

      BEGIN -- begin start
        v_select:='select sum(NVL(salary,0)) ,sum(NVL(salary1,0))
                     INTO v_sal ,v_sal1
                     from '||v_table1||' 
                     where col1 ='''||v_records.column1||'''
                       and col2 ='''||v_records.column2||'''
                       and col3 IN (select col3
                                      from XXYYZZ
                                      where column1 = '''||newvariable passing from procedure||'''
                                        and column2 = '''||v_records.column2||''')';
        --DBMS_OUTPUT.PUT_LINE(v_select);
        EXECUTE IMMEDIATE v_select; 
      exception
        when others then
          DBMS_OUTPUT.PUT_LINE(sqlerrm);
      end; -- end
    end loop;
  end;

【问题讨论】:

什么是newvariable passing from procedure 【参考方案1】:

一个问题是你有if deptno=10 没有关注then。另一个是同一if 语句中的elsif 也缺少then。在 PL/SQL 中,if 语句通常应该是:

IF condition THEN
  block_of_code;
ELSIF condition2 THEN
  another_block_of_code;
ELSE
  yet_another_block_of_code;
END IF;

Documentation here

另外v_cursor= 'select * from '||v_table||'';应该是

v_cursor := 'select * from '||v_table||'';

这是因为 PL/SQL 中的赋值运算符是 :=,而不是 C、C++、Java、C# 等中的 =

最后,您的代码末尾似乎缺少一个 END 语句。

分享和享受。

【讨论】:

【参考方案2】:

我认为,在您的代码中:

 if deptno=10
    v_table=abc;
    v_table1=abc1;
  elsif deptno=20
    v_table=xyz;
    v_table1=xyz1;
  end if;

分配应该是“:=”而不是“=”。另外,假设“abc”、“abc1”等是文字而不是变量,请尝试用单引号括起来:

 if deptno=10
    v_table:='abc';
    v_table1:='abc1';
  elsif deptno=20
    v_table:='xyz';
    v_table1:='xyz1';
  end if;

【讨论】:

以上是关于动态 Oracle 错误的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:使用 SQL 或 PL/SQL 查找动态 SQL 中的错误位置

Oracle错误:动态执行表不可访问,本会话自动统计被禁止,关闭自动统计之后的问题

pl/sql 块中的子选择上的 Oracle 8i 动态 SQL 错误

php: 加载 oracle 驱动程序给出错误“无法加载动态库 - 找不到指定的过程。”

Oracle错误:动态执行表不可访问,本会话自动统计被禁止,关闭自动统计之后的问题

动态 SQL 的 Oracle PL/SQL 异常