动态 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 驱动程序给出错误“无法加载动态库 - 找不到指定的过程。”