2016-09-12 13 views
1

私は経験豊富なSQL Serverプログラマですが、Oracleは初めてです。私はストアドプロシージャを記述したい。最初にやりたいことはグローバルテンポラリテーブルを作成し、結果を返す(私はこれをSQL Serverで何度もやったことがあります)。Oracleのストアド・プロシージャ内にグローバル・テンポラリ・テーブルを作成します

ここに私が持っているものの骨格があります。 Oracleは不平を言う。誰かがなぜそれについて何をやるべきか教えてもらえますか?

おかげで、

ディック

create or replace PROCEDURE usp_MU_Secure_Msg_Rpt (startdate IN varchar2, enddate IN varchar2) 

IS 

BEGIN 

CREATE GLOBAL TEMPORARY TABLE Denominator_pvids 

(pvid number (38,0), 

searchname varchar2 (78), 

no_distinct_pids integer, 

no_secure_messages integer) 

ON COMMIT DELETE ROWS; 


--SQL to populate table goes here 


SELECT * FROM Denominator_pvids 


END; 
+0

、一時テーブルをSQL Serverでは非常に一般的であるが、彼らは、オラクルでは非常にまれです。グローバル・テンポラリ・テーブルを作成してOracleで使用することはできますが、Oracleでテンポラリ・テーブルを使用しない方が幸いです。代わりにPL/SQLコレクションが必要な場合があります。 http://stackoverflow.com/questions/7192774/alternative-for-a-mysql-temporary-table-in-oracle/7193529#7193529 –

答えて

4

はどのCREATE TABLE文は内で使用することはできませんDDL、である(私は、ストアドプロシージャの外でグローバル一時表を作成して、それが期待通り動作します) PL/SQLブロック(例外:動的SQL - ただし、ここでは必要ありません)。

あなたがすべきことは、永続的なテーブルと同じように、(Global Temp)テーブルを事前に作成することです。 DBA初心者が作成しましたか?

あなたはそれにアクセスすることができます/それを切り捨ててください..あなたが望むものは何でも...大丈夫です。 (TRUNCATEは動的SQLを必要としますが、おそらく必要ありませんが、実際にどのように使用しているかによって異なります)

グローバルテンポラリテーブルの利点は、そのセッションのデータ。しかし、テーブル自体は、常に最初から存在していなければなりません。

悪魔の主張者として。ルーチン内で動的SQLをCREATE GLOBAL TEMPORARY TABLEに使用すると仮定しましょう。

2人が同じ時間にあなたのルーチンを呼び出すとどうなるかを考えてみてください... (両者は同じテーブルを作成しようとしています!O.o oops)。

だから、DBAに最初にそれを作成させてください。その後、INSERT/UPD/DELを使用して、必要に応じてINSERT/UPD/DELすることができます。

ここでは、1が使用されている例を示します。余談として

https://oracle-base.com/articles/misc/temporary-tables

+0

oracleの一時表は、SQLサーバーとまったく同じではありません。 @Dittoは言ったように、あなたは1つの時間を作成します。 – OldProgrammer

関連する問題