• ベストアンサー

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

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

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

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

  • ベストアンサー
  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.1

下記の要領でどうでしょうか? ※変数の定義 var c1 number; var c2 number; var r1 number; ※実行 exec procXXXXXXXX(:c1, :c2, :r1); ※結果の確認 print c1; print c2; print r1;

tatsurou
質問者

お礼

Yeti21さん 回答ありがとうございました。 教えて頂いた方法で実行できました。

関連するQ&A

  • ストアドファンクションの実行

    CREATE OR REPLACE FUNCTION hoge(str IN VARCHAR2) ~ を作成した後、 PL*SQLにてSQL> exec hoge('fuga'); を実行すると、 行1でエラーが発生しました。: ORA-06550: 行1、列7: PLS-00221: 'hoge'がプロシージャではないか、または未定義です・ ORA-06550: 行1、列7: PL/SQL: Statement ignore と言われます。 どうすればエラーを解決できますでしょうか? 助言を宜しくお願い致します。

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

    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 / 警告: プロシージャが作成されましたが、コンパイル・エラーがあります。

  • PL/SQL ストアドプロシージャが実行できません

    はじめまして、ほんの最近プログラムの世界に入ったキグと申します。 2週間、インターネットや参考書(ポケットリファレンス、PL/SQL入門)などで調べていたのですが分かりませんでしたので質問させていただきます。 ORACLE11gパーソナルエディションでやっています。 (CSEで作成実行しました。) **************************** 作ったSQL文 CREATE OR REPLACE PROCEDURE PRO_1 IS BEGIN (実行確認できたSELECT文) END ※試してみたこと、 SELECT文の列指定はアスタを使わずに書きました。 AUTHID CURRENT_USERをプロシージャ作成のときに入れてみました。  **************************** EXEC PRO_1 エラー→構文エラーまたはアクセス違反です。 BEGIN PRO_1; END; エラー→オブジェクト'PRO_1'が無効です。 上記エラーが出まして実行できていない状態です。 解決方法が分かる方いらっしゃいましたら、ぜひ回答を お願いしたいです。 以上よろしくお願い申し上げます。

  • ストアドプロシージャでのパラメータのデータ型の質問

    いつもお世話になっております。たびたびの質問で恐縮です。 ストアドプロシージャでのパラメータのデータ型が設定できず困っております。たとえば次はパラメータの文字を表示させるものです。 CREATE OR REPLACE PROCEDURE test(p VARCHAR2(10)) IS t VARCHAR2(10); BEGIN t:=p; DBMS_OUTPUT.PUT_LINE(t); END; / コンパイルエラーになるので、パラメータのデータ型を、VARCHAR2のように(10)を取るとうまくいきます。しかし、変数定義の「t VARCHAR2(10)」の(10)を取ると文字列の制約制限からはずれるとのエラーになります。 VARCHAR2というのは、PL/SQLの変数あるいはパラメータではどのように記述すればよろしいのでしょうか。 基本的なことを理解しておらず、申し訳ありません。 どうか、よろしくお願いいたします。

  • ストアドの戻り値(配列)について

    ストアドをコールして配列型の戻り値を取得したいのですが、 エラーが出てしまい原因が分かりません。 どなたかご教授頂けないでしょうか? ★PL/SQL★ CREATE OR REPLACE TYPE TBL_NUM10 AS VARRAY(10) OF NUMBER(10); CREATE OR REPLACE PACKAGE TEST_PKG IS TYPE TBL_NUM10 IS VARRAY(10) OF NUMBER(10); PROCEDURE HAIRETU(O_CNT OUT TBL_NUM10); END TEST_PKG; / CREATE OR REPLACE PACKAGE BODY TEST_PKG IS PROCEDURE HAIRETU(O_CNT OUT TBL_NUM10) IS TMP_CNT TBL_NUM10; BEGIN TMP_CNT := TBL_NUM10(0,0,0,0,0,0,0,0,0,0); TMP_CNT(1) := 1; TMP_CNT(2) := 2; TMP_CNT(3) := 3; O_CNT := TMP_CNT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); END HAIRETU; END TEST_PKG; / DECLARE O_CNT TBL_NUM10; BEGIN TEST_PKG.HAIRETU(O_CNT); DBMS_OUTPUT.PUT_LINE(O_CNT(1)); DBMS_OUTPUT.PUT_LINE(O_CNT(2)); DBMS_OUTPUT.PUT_LINE(O_CNT(3)); END; / ★実行結果★ SQL実行中に以下のエラーが発生しました。 ORA-06550: 行4、列4: PLS-00306: 'HAIRETU'の呼出しで、引数の数または型が正しくありません。 ORA-06550: 行4、列4: PL/SQL: Statement ignored よろしくお願いします。

  • 動的なSQLからカーソルを返す。

    下記のようなカーソルを返すパッケージがあったとします。 CREATE OR REPLACE PACKAGE TEST AS CURSOR C1 IS SELECT * FROM テーブル; TYPE TC1 IS REF CURSOR RETURN C1%ROWTYPE; PROCEDURE P_TEST(in条件 IN CHAR, CU OUT TC1); END; CREATE OR REPLACE PACKAGE BODY TEST IS PROCEDURE P_TEST(in条件 IN CHAR, CU OUT TC1) AS sqlStr VARCHAR2(1000); cur NUMBER; r NUMBER; BEGIN cur := DBMS_SQL.OPEN_CURSOR; sqlStr := 'OPEN CU FOR SELECT * FROM テーブル WHERE 条件 = ' || in条件; DBMS_SQL.PARSE(cur, sqlStr, DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(cur, 1, CU); r := DBMS_SQL.EXECUTE(cur); DBMS_SQL.CLOSE_CURSOR(cur); END; SELECTした結果のカーソル(CU)をクライアントで取得したいのですけど 技術的に可能でしょうか? ストアドのコンパイル時に→DBMS_SQL.DEFINE_COLUMN(cur, 1, CU);が エラーとなります。 DBMS_SQL.DEFINE_COLUMNではカーソルタイプは取得できないとわっかたの ですがカーソルを取得する為のDBMS_SQL.DEFINE_COLUMNにかわる DBMS_SQL.?????はないでしょうか? いろいろ調べたのですが手に負えず。 どなたか教えてください。

  • VBからストアドの動的SQLを呼んで値をレコードセットで取得する方法

    お世話になります。 VBからストアドの動的SQLを呼んで、VB側で値をレコードセットで取得する方法を探しています。 ■ストアド CREATE OR REPLACE PACKAGE SAMPLE as CURSOR c2 IS select A from TBL; TYPE TANTOYOSANDATA IS REF CURSOR RETURN c2%ROWTYPE; PROCEDURE GetNUMBER(C IN NUMBER,           CU OUT TANTOYOSANDATA); end; / -- CREATE OR REPLACE PACKAGE BODY SAMPLE IS PROCEDURE GetNUMBER(C IN NUMBER,             CU OUT TANTOYOSANDATA) IS CUR INTEGER; STATUS INTEGER; ROW_PROCESSED INTEGER; A NUMBER; BEGIN --カーソルをOPENする CUR :=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(CUR,'SELECT A FROM TBL ',DBMS_SQL.V7); DBMS_SQL.DEFINE_COLUMN(CUR,1,A); ROW_PROCESSED :=DBMS_SQL.EXECUTE(CUR); STATUS :=DBMS_SQL.FETCH_ROWS(CUR); WHILE (STATUS <> 0) LOOP DBMS_SQL.COLUMN_VALUE(CUR,1,A); STATUS :=DBMS_SQL.FETCH_ROWS(CUR); END LOOP; END; END SAMPLE; / ■VB側 Set GoORASESSION = CreateObject("OracleInProcServer.XOraSession") Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, ORADB_DEFAULT) Set Recordset = GoORADATABASE.CreatePLSQLDynaset("Begin SAMPLE.GetTANTOINFO(1,:CU)); end;", "CU", ORADYN_DEFAULT) ' If Recordset.EOF Then Do While Not Recordset.EOF Label11.Caption = Recordset(0) Recordset.movenext  Loop 復帰値をRecordSetで受けて それをまわしながら1レコードずつ取得する方法を探しています よろしくお願いします。

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

    以下のようなパッケージを作っています。 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のストアドようにテーブル のような構造で値を返えせればいいです。

  • PL/SQLでカーソルを指定する方法

    以下のSQL文で、 あるストアドプロシージャを作成し、その引数の値を WHERE句の検索条件に取ってカーソルを宣言したいので すが、どうやってもエラーが出ます。結果として カーソルで格納したデータを呼び出し元に返したいの ですが…。下記の文は間違ってますか? CREATE OR REPLACE PROCEDURE ss( quote IN NUMBER result OUT CHAR ) IS CURSOR cur IS SELECT empname FROM emp WHERE empno = quote; result cur%rowtype; BEGIN OPEN cur; LOOP FETCH cur INTO result; ~ END; どうかよろしくお願いします。

  • crontabでsql/plusの起動

    シェルスクリプトでsql/plusを呼び出し、ストアドプロシジャを 実行しようとしているのですが、crontabを使ったスケジュール起動を 行おうとすると、以下のようなエラーになってしまいます。 Message file sp1<lang>.msb not found Error 6 initializing SQL*Plus not foundと言われているファイルに心当たりがありません。 sql/plusがバックグラウンドで使っているファイルなのでしょうか? ちなみに、crontabを使わずに、コマンドラインから このシェルスクリプトを実行すると、正常に動作します。 UNIXもシェルスクリプトも超初心者です。 ご存知の方おられましたら、ご教授願います。 OSはRedHat6.2J、Oracle8.1.7です。