0

最近、私は定期的なレポートプロセスのためにデータマートの準備を始め、パラメータを使用したプロシージャを利用しようとしました。

だから私はこのガイドラインを読んで複製しようとしましたが、コンパイルのエラーと混同しました。

これが私のコードです:

create or replace procedure mig_rate @rep_date date AS 
    create or replace table mig_temp1(
    report_date date,
    portfolio string,
    bucket integer,
    Q integer);
begin    
    for j in 1..7 loop 
        for t in 0..32 loop
       -- execute immediate 'bla-bla-bla insert statement mig_temp1
        end loop;
    end loop;
end

これは、そのシンボルが予想外だったPLS-00103と言う結果になります。@

構文の何が問題になっていますか?パラメータをプロシージャにどのように配置する必要がありますか?

4

1 に答える 1

0

主な誤りは、Oracle データベースで SQL Server 構文を使用しようとしているということです。

まず、Oracleオブジェクト名は文字で開始する必要があります (引用符で囲まれた識別子を使用しない限り、ただし使用しないでください)。関連する部分は次のとおりです。

引用符で囲まれていない識別子は、データベース文字セットのアルファベット文字で始まる必要があります。引用符で囲まれた識別子は、任意の文字で始めることができます。

引用符で囲まれていない識別子には、データベース文字セットの英数字と、アンダースコア (_)、ドル記号 ($)、ポンド記号 (#) のみを含めることができます。データベース リンクには、ピリオド (.) とアットマーク (@) を含めることもできます。引用符で囲まれていない識別子に $ および # を使用しないことを強くお勧めします。

引用符で囲まれた識別子には、任意の文字、句読点、およびスペースを含めることができます。ただし、引用符付きまたは非引用符付きの識別子には、二重引用符またはヌル文字 (\0) を含めることはできません。

...したがって、プロシージャ名ではまったく使用できず@、SQL Server のものであるため、使用する必要はありません (私はそれを使用していないと思います!)。

編集:ほら、私はSQL Serverに慣れていないので、それが何をしていたのか読み間違えました。プロシージャ名は問題ありませんが、パラメータを宣言する方法ではありません。開始する必要があります:

create or replace procedure mig_rate(rep_date date) as
...

次に、Oracle プロシージャーでそのようなテーブルを作成 (宣言?) することはできません。プロシージャの実行中に一時テーブルが必要なように見えますが、それは Oracle の仕組みではありません。プロシージャの外でグローバル一時テーブルを作成できますが、これは永続的なデータベース オブジェクトです。データのみが一時的なものです。

代わりにPL/SQL コレクションを使用できますが、それをどうしたいかによって異なります。通常のテーブルに挿入する前のステージング領域である場合は、単一の SQL コマンドとして実行できる可能性があり、パフォーマンスが向上します。

ここで動的 SQL ( ) を使用する理由がわかりませんexecute immediate...

何をすべきかについては、SQL Server 固有のサイトではなく、PL/SQL 言語リファレンスと Oracle 固有のサイトを参照してください。それらがどのように機能するかに非常に大きな違いがあります。

于 2013-02-15T13:07:02.810 に答える