2

次の手順を作成しました

Create or replace procedure abcd
(
    tab_name in USER_TABLES.table_name%type
)
is
begin
execute immediate
'select * from'||tab_name;
end abcd;

プロシージャがコンパイルされます。

次を使用して出力を取得しようとしています

select abcd('Table') from dual ;

私は動的 SQL を初めて使用しますが、これはうまくいかないようです。エラーが発生し続けます

[エラー] 実行 (44: 8): ORA-00904: "ABCD": 無効な識別子

誰か助けてくれませんか?

よろしく、 クシティジ

4

3 に答える 3

1

テーブル名の前にスペースがありません:

create or replace procedure abcd (tab_name in USER_TABLES.table_name%type )
is
begin
    execute immediate 'select * from '||tab_name;
end abcd;

プロシージャではなく関数として呼び出そうとしているため、これは機能しません。

select abcd('Table') from dual ;

2 回目の試行が機能するはずです。

exec abcd('Table');

...しかし、別のエラーが発生します。PL/SQL では、何かを選択する必要があります。この場合、おそらく動的文字列でカーソルを開き、結果に対して何かをしたいと思うでしょう。ただし、最終目標が何であるかはよくわかりません。

動的 SQL について学習するときに、SQL インジェクションについても読む必要があります。

于 2013-06-07T07:00:19.880 に答える
0

効果がないでしょう。

EXECUTE IMMEDIATE を呼び出すと、SQL ステートメントが SQL エンジンに送信されます。結果は PL/SQL に返されません。

"SELECT * FROM a_table" と書くことはそれほど難しくなく、より安全です。

于 2013-06-07T08:32:34.153 に答える
0

プロシージャで選択を実行することはできません。関数は、単一のレコードが返される場合にのみ機能します。使用する

abcd() を開始します。終わり; またはexecuteキーワードを使用

また、クエリの from の後にスペースを使用します

于 2013-06-07T07:03:57.740 に答える