......至少我认为这就是问题所在。
我正在编写一个函数,其中包含一个游标声明,该声明访问一个表,其中一列是保留字NUMBER(是的,我知道..)。该函数在编译时遇到问题:
错误(16,10):PL / SQL:ORA-06552:PL / SQL:编译单元分析终止ORA-06553:PLS-488:无效变量声明:对象'NUMBER'必须是类型或子类型
我的代码类似于:
CURSOR my_cur
IS
SELECT "NUMBER", col2, col3
FROM tb1_x;
为了确保问题,我将代码更改为
CURSOR my_cur
IS
SELECT 'NUMBER', 'col2', 'col3'
FROM dual;
它编译得很好,但显然这不是我想要的。
不幸的是,我没有选择更改列名(叹气)和记录
SELECT "NUMBER", col2, col3
FROM tb1_x;
在正常的SQL执行中正常工作。
无论如何我可以解决这个问题?非常感谢任何帮助!
答案 0 :(得分:1)
我们也可以在游标中创建记录以及使用列。从游标中获取数据对我来说很惊讶,因为我之前使用过它。
Create table temp2("number" integer,id integer,name varchar2(200));
insert into temp2 values(1,1,'Gaurav Soni');
insert into temp2 values(2,2,'Niharika Saraf');
Commit;
DECLARE
type abc is record(
"number" number,
id NUMBER,
name varchar2(200));
v_rec abc;
TYPE v_cur IS REF CURSOR;
cur v_cur;
v_temp INTEGER;
BEGIN
OPEN cur FOR
SELECT "number", id, name FROM temp2;
LOOP
FETCH cur INTO v_rec;
EXIT when cur%notfound;
DBMS_OUTPUT.put_line('number is ' || v_rec."number");
DBMS_OUTPUT.put_line('id is ' || v_rec.id);
DBMS_OUTPUT.put_line('name is ' || v_rec.name);
end loop;
CLOSE cur;
end;
<强>输出强>
number is 1
id is 1
name is Gaurav Soni
number is 2
id is 2
name is Niharika Saraf
答案 1 :(得分:0)
Create table temp2("number" integer);
insert into temp2 values(1);
insert into temp2 values(2);
insert into temp2 values(3);
commit;
DECLARE
TYPE v_cur IS REF CURSOR;
cur v_cur;
v_temp INTEGER;
BEGIN
OPEN cur FOR
SELECT "number"
FROM temp2;
FETCH cur
INTO v_temp;
DBMS_OUTPUT.put_line ('number is ' || v_temp);
CLOSE cur;
END;
<强>输出强>
数字是1
我无法复制此问题,但这对我来说很合适
答案 2 :(得分:0)
嗯。 Cursor声明的结构与我的略有不同。你能试试这个:
drop table temp2;
Create table temp2("NUMBER" integer );
insert into temp2 values(1);
Commit;
CREATE OR REPLACE FUNCTION func1
RETURN VARCHAR2
IS
l_dummy VARCHAR2(10) := '';
CURSOR cur1 IS
SELECT * FROM temp2;
BEGIN
FOR a_rec IN cur1
LOOP
l_dummy := 'dummy';
END LOOP;
RETURN l_dummy;
END func1;
/
SHOW ERRORS;
以上点击编译错误。只需更改第二行即可删除我设法编译的保留字。 BTW我正在使用Oracle SQL Developer客户端连接到Oracle 10.2 db。
Create table temp2("NUMBERxxx" integer );