• ベストアンサー

ストアドプロシジャで、TRUNCATEするには?

ストアドプロシジャで、TRUNCATEするには? 例、 CREATE OR REPLACE PROCEDURE TAI_00NEN AS BEGIN TRUNCATE TABLE CHOSEIWR; COMMIT; END; / これだと、コンパイルエラーがありますとなります。

  • Oracle
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.3

TRUNCATEはDDLですから、PL/SQLから実行するには動的SQLを使う必要があります。 8i以降なら EXECUTE IMMEDIATE 8以前なら DBMS_SQL をマニュアルで調べてください。 (もちろん権限も必要)

その他の回答 (2)

回答No.2

こんにちは。 PL/SQLから直接DDL文は実行できません・・・。 DBMS_SQLパッケージを使用すればできますよ。 (^^ゞ

  • tyurajima
  • ベストアンサー率28% (16/57)
回答No.1

回答ではありませんが・・・ そうですね。こちらで試しても出来ませんでした。 TRUNCATEで検索してみると、下記のURLが引っかかりました。 もしかしたら、関係しているのかもしれません・・・ 参考になれば・・・

参考URL:
http://sonic64.hp.infoseek.co.jp/2004-06-09.html

関連するQ&A

  • ストアド実行時のエラー「参照しているコレクションは初期化されていません」

    以下のようなパッケージを作っています。 CREATE OR REPLACE PACKAGE "TEST"."TEST_P" as type test_type1 is table of TEST.TEST_TABLE%ROWTYPE; procedure test2 (ret OUT test_type1 ) ; end; ----------------------------------- 本体 ----------------------------------- CREATE OR REPLACE PACKAGE BODY "TEST"."TEST_P" as procedure test2( ret OUT test_type1 ) is cursor basic_cusor is select * from TEST.TEST_TABLE; BEGIN open basic_cusor; loop fetch basic_cusor into ret(0); exit when basic_cusor%notfound; END loop; END TEST3; end; ---------------------------------------- これをSQL Pluseから set serveroutput on; declare  arg1 TEST.TEST_P.test_type1; begin TEST.TEST_P.test2(arg1); dbms_output.put(arg1(0).coulm1); end; のように実行するとエラーが出ます。 初期化処理とはどのように行えばいいのでしょうか? 最終的にはSQLServerのストアドようにテーブル のような構造で値を返えせればいいです。

  • ストアドプロシージャからアナライズをしたいです

    どなたかアドバイス願います。 ストアドプロシージャから「DBMS_STATS.GATHER_TABLE_STATS」パッケージを使って アナライズをやりたいと思っているのですができません。 以下のSQLをSQL*Plusから実行するとうまく動作するのですが、 プロシージャから「EXECUTE IMMEDIATE」を使って動作させると コンパイルエラーとなってしまうのです。 ※本当はテーブル名を動的に変更したいと考えているのですが、まずはコンパイルを 通したいと思いまして以下サンプルとしています。 (SQL*Plus経由で以下を実行すると動作します) exec DBMS_STATS.GATHER_TABLE_STATS (OWNNAME=>'SCOTT',TABNAME=>'EX001',METHOD_OPT =>'FOR ALL INDEXED',CASCADE => TRUE); (コンパイルエラーとなるプロシージャ) CREATE OR REPLACE PROCEDURE TEAT01 AS BEGIN EXECUTE IMMEDIATE DBMS_STATS.GATHER_TABLE_STATS (OWNNAME=>'SCOTT',TABNAME=>'EX001',METHOD_OPT =>'FOR ALL INDEXED',CASCADE => TRUE); END TEAT01; (エラーメッセージ) Error(3,19): PLS-00222: この有効範囲内に、名前GATHER_TABLE_STATSの関数は存在しません。 以上よろしくお願いします。

  • プロシージャ作成がしたい

    SQL*Plusに下記のコードを記述したところ 「警告~」という内容のエラーが起こってしまいました。 どうしてコンパイルがうまくいかないのでしょうか? 初めてPL/SQLを勉強しているのでひとりで長いこと悩んでます。。。 どなたかご協力お願いします! SQL> CREATE OR REPLACE PROCEDURE ProcA( 2 i1 IN NUMBER, 3 i2 IN NUMBER, 4 o1 OUT NUMBER) IS 5 BEGIN 6 o1 = i1 + i2; 7 RETURN; 8 END; 9 / 警告: プロシージャが作成されましたが、コンパイル・エラーがあります。

  • トリガーにてビューを作成しようとすると・・

    WindowsXPのOracle9i環境です。 以下のようなトリガーを作成しました。 create or replace trigger kan_trg after update or insert on t_kan declare begin execute immediate 'create or replace view V_test as select ・・ from t_kan with read only'; end; / その後、試しに「insert into t_kan ・・・」 と実行してみましたが、「ORA-04092:トリガーはCOMMITできません」が発生します。 色々調べましたがトリガーの中にCOMMIT文を入れることはできないようです。どのようにすれば解決するか、ご教示いただけませんでしょうか? 宜しくお願い致します。

  • VBからストアドプロシジャを実行

    VBからストアドプロシジャを実行すると、下記のエラーが発生します。 型 'System.InvalidOperationException' の初回例外が Oracle.DataAccess.dll で発生しました オブジェクトの現在の状態に問題があるため、操作は有効ではありません。 テーブルとプロシジャはシステムユーザの管理下にあり、一般ユーザで接続しています。直接SQLを実行すると正しく動作しています。以下にコードを示しますが、どこに問題があるのでしょうか。システムユーザの管理下にある事より直接SQLを実行した時と同じ様に「system.xxx」としても結果は変わりませんでした。あと、一般ユーザにはconnectとselectの権限のみ与えています。 ■VB側のコード 'オブジェクト Dim oraCmd As New OracleCommand 'PL/SQLパラメタ Dim oraPrm1 As OracleParameter Dim oraPrm2 As OracleParameter ' 実行タイプ(PL/SQLとして実行) oraCmd.CommandType = CommandType.StoredProcedure ' プロシージャ名 oraCmd.CommandText = "GETNAME" ' パラメータクリア oraCmd.Parameters.Clear() ' 1つ目のパラメータ( IN なのでデータセット ) oraPrm1 = oraCmd.Parameters.Add("PM_STRING", OracleDbType.Varchar2) oraPrm1.Value = "2001" oraPrm1.Direction = ParameterDirection.Input ' 2つ目のパラメータ( OUT なので、Direction プロパティにセット ) oraPrm2 = oraCmd.Parameters.Add("PM_NUMBER", OracleDbType.Int16) oraPrm2.Direction = ParameterDirection.Output Try ' 結果を受け取り、後で処理する oraCmd.ExecuteNonQuery() Catch ex As Exception conn.Close() Console.WriteLine(ex.Message) Return End Try Console.WriteLine(oraPrm2.Value.GetType()) ■ストアドプロシジャ CREATE OR REPLACE PROCEDURE GETNAME (IN1 IN NUMBER, OUT1 OUT VARCHAR2) AS BEGIN select NAME INTO OUT1 from TEST where CODE = IN1; END GETNAME;

  • ストアドファンクションを差し替えたい

    VIEW は、CREATE OR REPLACE VIEW のようにして差し替えることができますが、 ストアドファンクションは、このような差し替えには対応していないのでしょうか? 本番稼動しているデータベースのストアドファンクションを差し替えたい場合は、 BEGIN DROP FUNCTION CREATE FUNCTION COMMIT とすればよろしいでしょうか?

  • コメントが消えてしまいます

    mysqlのクライアントから、create procedure文を入力し、表示するとコメントが消えてしまいます。 (例) >delimiter // >CREATE PROCEDURE abc() >BEGIN >#comment >SELECT "A"; >END; >// >SHOW CREATE PROCEDURE abc; >// +-----------+----------+---------------------------------------------------------------------------+ | Procedure | sql_mode | Create Procedure | +-----------+----------+---------------------------------------------------------------------------+ | abc | | CREATE DEFINER=`root`@`localhost` PROCEDURE `abc`() BEGIN SELECT "A"; END | どうしたらコメントが入れられるか、どなたかお知恵をお貸しください。 mysqlのバージョンは 5.1で、OSはRedHat EL5です。 どうぞよろしくお願いいたします。m(__)m

  • PL/SQLについて

    以下のVIEWをPROCEDURE内で使用しています。 CREATE OR REPLACE VIEW VW_KAIIN (CODE,NAME,TEL,STARTYMD) AS SELECT * FROM KAIIN WHERE STARTYMD <= TO_CHAR(SYSDATE,'YYYYMMDD') ※STARTYMDには有効な開始日付が入ります。 条件部分でSYSDATEではまずいことになり、 特定の日付を指定しなければならなくなりました。 VIEW自体にパラメータ渡しはできないということで、 CREATE OR REPLACE PROCEDURE TABLE_B_UPDATE (I_YYYY IN TABLE_A.YYYYY%TYPE, I_MM IN TABLE_A.MM%TYPE, I_DD IN TABLE_A.DD%TYPE,) PROCEDURE内でI_YYYY、I_MM、I_DDを条件に変更した VIEWを動的に作成して、処理をしたいのですが、 こういった事は可能でしょうか? そのまま書いてみましたが、CREATE部分でエラーが出てしまい、コンパイルできませんでした。 もし不可能である場合は、代替案をご教授いただけるとありがたいです。 どうかよろしくお願いします。

  • oracleのfunctionで戻り値複数個

    oracleのストアドプロシージャのファンクションについてですが、 ファンクションは、戻り値を返すことができますが、 それを、複数個返すことはできるのでしょうか。 CREATE [OR REPLACE] FUNCTION ファンクション名(引数 IN データ型[, ...]) RETURN 戻り値の型 IS 宣言部 BEGIN 処理部 END ; お願いします。

  • ストアドをSQL*PLUSで実行したい。

    こんにちわ。 いまORACLE10gのPLSQLでストアドプロシジャを作成しています。 CREATE OR REPLACE PROCEDURE procXXXXXXXX ( oCNT1 OUT NUMBER , oCNT2 OUT NUMBER , nRET OUT NUMBER ) IS ~ というものですが,これをSQL*PLUSでテストとして実行したいのですが,変数定義などどうすれば良いでしょうか? 教えてください。よろしくお願いします。