动态Oracle错误

时间:2014-07-03 23:37:11

标签: oracle plsql

收到错误" ORA-00905缺少关键字"从内部异常开始和结束;任何想法? 基于deptno传递所有表名(dyanmically) 内心开始抛出那个错误。 收到错误" ORA-00905缺少关键字"从内部异常开始和结束;任何想法? 基于deptno传递所有表名(dyanmically) 内心开始抛出那个错误。

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;

2 个答案:

答案 0 :(得分:0)

一个问题是,您if deptno=10没有跟随then。另一个原因是同一elsif语句中的if也缺少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语句。

分享并享受。

答案 1 :(得分:0)

我认为,在您的代码中:

 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;