2017-11-18 15 views
0

以下のコードはエラーORA-00942: table or view does not existを返します。PL/SQLランタイムエンジン(または何かわからないもの)がテーブルとして扱われている可能性があります。どうしてそうするのですか、私はすでにtable_inを変数として宣言しています。変数が置き換えられない(動的PL/SQLの学習)

ex26011601テーブルは、同じスキーマ内の値とともに存在します。

set serveroutput on 

declare 
    function tabcount (table_in in varchar2) 
     return pls_integer 
    is 
     l_return pls_integer; 
    begin 
     select count(*) into l_return from table_in; 
     return l_return; 
    end; 
begin 
    dbms_output.put_line(tabcount('ex26011601')); 
end; 

私はEXECUTE IMMEDIATEが目的を解決すると理解しています。私が得ようとしているのは、現在のステートメントでなぜ必要であり、スコープ内で宣言されても 'table_in'を変数として扱うことができないということです。または、変数がそこに期待されない理由は何ですか?

+0

SELECT文の –

+0

PL/SQLは、ちょうど無差別に一致させるために起こる任意のテキストを代用しないからですパラメータ名。パラメータ化されたカーソルのコンテキストでは、バインド変数のみが評価されます。 –

答えて

2

を私は目的を解決するEXECUTE IMMEDIATEを理解しています。私は を取得しようとしているのですが、現在の ステートメントでは、なぜそれが必要であり、スコープ内で が宣言された後でも、 'table_in'を変数として扱うことができませんでした。

Oracleのドキュメントを1として:そのSQLの対応は、バインド変数のプレースホルダを持つことができますどこStatic SQL

A PL/SQLの静的SQLステートメントは、PL/SQLの識別子を持つことができます。 PL/SQL識別子は、いずれかの変数または正式なparameter.To PL/SQLで

EXECUTE IMMEDIATE文を使用し、テーブル名、カラム名、およびのためのPL/SQLの識別子を使用してユーザーを識別しなければなりません実行するために、動的SQLが必要です。たとえば、テキスト不明で、コンパイル時に

  • SQL、(表名など)、コンパイル時に不明な識別子を含むSELECT文をか のWHERE句の数コンパイル時にサブクラートは不明です。

  • 静的SQLとしてサポートされていないSQL

Dynamic SQL

+0

コンパイル時にテキストが不明な_SQL ._ helped –

-1

はい、oracle pl/sql構文では許可されていないので、変数によって表名を渡します。また、あなたは、動的SQLでそれを行うとすぐに実行することができます言ったように:

execute immediate 'select count(*) from ' || table_in 
into l_return; 
+0

'table_in'はテーブルの名前を格納する変数です。私はテーブルの行の総数をカウントするtryongです。 –

関連する問題