主な誤りは、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 固有のサイトを参照してください。それらがどのように機能するかに非常に大きな違いがあります。