0

動的SQLプロシージャが機能しないのはなぜですか?私がやろうとしているのは、テーブルの単純な列を表示することだけです。次のエラーが発生します。

1行目のエラー:ORA-06550:1行目、7列目:PLS-00905:オブジェクトSYSTEM.JOINが無効ですORA-06550:1行目、7列目:PL / SQL:ステートメントは無視されます

 create or replace procedure join
(p_table1 in varchar2,
p_joincolumn1 in varchar2,
p_joincolumn2 in varchar2)
 AS
lv_query varchar2(500);
lv_cursor number;
lv_col1 VARCHAR2(30);
lv_col2 VARCHAR2(30);
loopcount number:=0;
cursor_return_value integer;
 begin
lv_cursor:=dbms_sql.open_cursor;
dbms_output.put_line('Value assigned to cursor= ' || lv_cursor );
lv_query:='select p_joincolumn1 from p_table1';
dbms_output.put_line(lv_query);
dbms_sql.parse(lv_cursor, lv_query, dbms_sql.native);
dbms_sql.define_column (lv_cursor, 1, lv_col1);
dbms_sql.define_column (lv_cursor, 2, lv_col2);
cursor_return_value := dbms_sql.execute (lv_cursor);
LOOP
    loopcount:=loopcount+1;
    dbms_output.put_line('loopcount= ' || loopcount );
    if dbms_sql.fetch_rows (lv_cursor)=0 then
        EXIT;
    end if;

    dbms_sql.column_value(lv_cursor, 1, lv_col1);
    dbms_sql.column_value (lv_cursor, 2, lv_col2);
    dbms_output.put_line(lv_col1 || '   ' || lv_col2 ); 
END LOOP;
 dbms_output.put_line('At end of loop');
 dbms_sql.close_cursor(lv_cursor);
 end;
 /

 execute join ('PROJECT', 'PROJECT.P_ID', 'PROJECT.SKILL_ID');

エラー:

 Procedure created.

 SQL> 
 SQL> execute testing_j ('PROJECT', 'PROJECT.P_ID', 'PROJECT.SKILL_ID');
 Value assigned to cursor= 20
 select p_joincolumn1 from p_table1
 BEGIN testing_j ('PROJECT', 'PROJECT.P_ID', 'PROJECT.SKILL_ID'); END;

 *
 ERROR at line 1:
 ORA-00942: table or view does not exist
 ORA-06512: at "SYS.DBMS_SYS_SQL", line 906
 ORA-06512: at "SYS.DBMS_SQL", line 39
 ORA-06512: at "SYSTEM.TESTING_J", line 17
4

3 に答える 3

1

プロシージャは、おそらくコンパイルエラーで作成されました。

2つのコマンドを一緒に実行しないようにしてください-1
。プロシージャを作成します-エラーで作成された場合は、コマンドで(sqlplusで)表示できます(ここでshow errエラーを表示する方法を確認できます) 2。プロシージャを実行します

あなたのコードに関して:
宣言の部分にあなたは行を持っています

lv_col2 VARCHAR2(30;)

これは

lv_col2 VARCHAR2(30);

これはコンパイルエラーである可能性があります。

ところで、IMHOはキーワード(join)でプロシージャに名前を付けるのは悪い習慣です

于 2012-11-22T06:24:51.853 に答える
1

のどのビット

ORA-00942: table or view does not exist

あなたを混乱させていますか?データベースにP_TABLE1というテーブルがないか、SYSTEMスキーマにP_TABLE1というテーブルがありません。データベースオブジェクト名はスキーマ内でのみ一意です。別のユーザーが所有するオブジェクトを参照する場合は、オブジェクト名の前にそのスキーマを付ける必要があります。

select p_joincolumn1 from user23.p_table1

また、そのユーザーは、オブジェクトに必要な権限を付与する必要があります...

... SYSやSYSTEMなどのユーザーを除いて、あらゆる特権を備えた強力なアカウント。SYSTEMスキーマはOracleシステムの不可欠な部分であり、それを使用するとデータベースが破損する可能性があるため、SYSTEMスキーマでオブジェクトを作成しないでください。

于 2012-11-23T05:49:43.880 に答える
0

私のコードを修正しました、そしてそれは今動作します。dbms_sql.nativeをdbms_sql.v7に変更し、一部の構文も変更しました。

create or replace procedure testing_j
(table_name in varchar2,
column1 in varchar2)
AS
lv_query varchar2(500);
lv_cursor number;
lv_col1 number(6);
loopcount number:=0;
cursor_return_value integer;
begin
lv_cursor:=dbms_sql.open_cursor;
dbms_output.put_line('Value assigned to cursor= ' || to_char(lv_cursor));
lv_query:='SELECT ' || column1 || ' FROM ' || table_name;
dbms_output.put_line(lv_query);
dbms_sql.parse(lv_cursor, lv_query, dbms_sql.v7);



dbms_sql.define_column (lv_cursor, 1, lv_col1);
cursor_return_value := dbms_sql.execute (lv_cursor);
LOOP
    loopcount:=loopcount+1;
    --dbms_output.put_line('loopcount= ' || loopcount );
    if dbms_sql.fetch_rows (lv_cursor)=0 then
        EXIT;
    end if;

    dbms_sql.column_value(lv_cursor, 1, lv_col1);
    dbms_output.put_line(lv_col1);  
END LOOP;
dbms_output.put_line('At end of loop');
dbms_sql.close_cursor(lv_cursor);
end;
/


PL/SQL procedure successfully completed.

SQL> execute testing_j ('PROJECT', 'PROJECT.P_ID');
Value assigned to cursor= 12
SELECT PROJECT.P_ID FROM PROJECT
1
1
2
3
3
4
4
5
5
6
7
7
At end of loop

PL/SQL procedure successfully completed.
于 2012-11-23T17:12:09.463 に答える