4

...至少我认为这是问题所在。

我正在编写一个函数,其中包含一个游标声明,该声明访问一个表,其中一列是保留字 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 执行中工作正常。

无论如何我可以解决这个问题吗?任何帮助深表感谢!

4

3 回答 3

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
于 2012-03-08T15:51:18.653 回答
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;

以上命中编译错误。只需更改第二行以摆脱保留字,我设法将其编译。顺便说一句,我正在使用连接到 Oracle 10.2 db 的 Oracle SQL Developer 客户端。

Create table temp2("NUMBERxxx" integer );
于 2012-03-09T01:24:06.970 回答
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;

结尾;

输出

数字是 1

我无法复制这个问题,但这对我来说很好

于 2012-03-08T05:37:15.017 回答