2012-03-08 11 views
4

...少なくとも私はそれが問題だと思います。予約語NUMBERが、カーソル宣言でエラーを引き起こす列名として使用されました

私は、列の1が予約語NUMBER(ええ、私は知っている。)であるテーブルにアクセスするカーソル宣言が含まれている機能を書いています。

エラー(16,10):PL/SQL:ORA-06552:PL/SQL:コンパイル単位分析が終了しましたORA-06553:PLS-488:無効な変数宣言:オブジェクト ' NUMBER」のタイプまたはサブタイプ

MYコードのようなものに見えている必要があります。それが問題であることを確認するために

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の実行でOK動作します。

とにかく私はこの問題を回避できますか?どんな助けでも大歓迎です!

+0

ここにストローで把握...しかし、あなたは、 'NUMBER'として「NUMBER」を選択するか、'そのようなNUMBER''か何か」として「NUMBER」を選択して試してみましたか? – gangreen

+0

@gangreen私はそれが動作するとは思わない..実際には、テーブルtb1_xが使用されている限り、カーソル宣言はコンパイル時に失敗し、犯人列「NUMBER」が全くアクセスされていなくても。以下のように失敗します: 'CURSOR my_cur IS SELECT col2、col3 FROM tb1_x;' – alchn

+1

私はこの問題を解決します。犯人テーブルを囲むようにビューを作成して、ビューのNBRとして列 "NUMBER"の名前を変更します。次に、元の表や「NUMBER」に言及せずに、ビューと列NBRを使用してカーソルを宣言できます。コンパイルして正常に動作しました。 – alchn

答えて

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

私はこの問題を複製することはできませんよ、これは私のためworkign結構です

+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 
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; 

上記ヒットコンパイルエラー。私はそれをコンパイルするために管理する予約語を取り除くために2行目を変更してください。私は、Oracle 10.2 dbに接続するOracle SQL Developerクライアントを使用しています。

Create table temp2("NUMBERxxx" integer); 
関連する問題