收到错误" 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;
答案 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;
此外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;