4

...少なくともそれが問題だと思います。

列の 1 つが予約語 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;

上記ヒットコンパイルエラー。2行目を変更して予約語を削除するだけで、なんとかコンパイルできました。ところで、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 に答える