PL/SQLのカーソル: センセーショナルなタイトルと要約文を生成する

このQ&Aのポイント
  • PL/SQLのカーソルについて詳しく教えてください。Oracle11gで開発中の初心者です。
  • 「zokuseisyutoku」というストアドプロシージャで取得した値を「Hyouji」という別のストアドプロシージャの変数に代入し、Gridviewで表示したいです。一つのストアドプロシージャにまとめる方法を知りたいです。
  • ストアドプロシージャ1つ目は「zokuseisyutoku」という名前で、sItemClassというパラメータを受け取り、コード表から入数、重量、才数、ロケーションを取得します。ストアドプロシージャ2つ目は「Hyouji」という名前で、irisuu、jyuryou、saisuu、lokesyonというパラメータを受け取り、部材表と資材項目を結合し、条件に合致するデータを取得します。
回答を見る
  • ベストアンサー

PL/SQLのカーソルについて

PL/SQLのカーソルについて お世話になります。 Oracle11gで開発しています。 初心者です。 下記ストアドプロシージャの「zokuseisyutoku」で取得した 値(入数、重量、才数、ロケーション)を受けて、別のストアドプロシージャ 「Hyouji」の変数(irisuu、jyuryou、saisuu、lokesyon)に代入して得られた 内容をGridviewに表示させたいと思っています。 現在は、別々のストアドプロシージャなのですが、 一つに出来るものなら一つのストアドプロシージャにまとめたいの ですが、どなたかご親切な方、ご教授頂きたく宜しくお願い致します。        記 (1)ストアドプロシージャ1つ目 create or replace procedure zokuseisyutoku ( sItemClass in コード表.品番%type, out_val out pls_integer, out_cursor out sys_refcursor ) as begin if sItemClass is null then open out_cursor for select 入数, 重量, 才数, ロケーション from コード表 ; else open out_cursor for select 入数, 重量, 才数, ロケーション from コード表 where 品番 = sItemClass ; end if; out_val := 1; (2)ストアドプロシージャ2つ目 create or replace procedure Hyouji ( irisuu in 部材表.入数%type, jyuryou in 部材表.重量%type, saisuu in 部材表.才数%type, lokesyon in 部材表.ロケーション%type, out_val out pls_integer, out_cursor out sys_refcursor ) as begin open out_cursor for select b.資材名,b.色,b.種類,b.サイズ,b.棚番号 FROM 部材表 a,資材項目 b WHERE a.ID = b.資材ID AND a.入数 = irisuu AND a.重量 = jyuryou AND a.才数 = saisuu AND ロケーション = lokesyon ; out_val := 1; end; end;

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

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

ループを二つに分ける必要ってありますか? この処理であれば一回のSQLで欲しいデータが取得できそうな気がしますが。 create or replace procedure hoge (  sItemClass in コード表.品番%type,  out_val out pls_integer,  out_cursor out sys_refcursor ) is begin  open out_cursor for   'select b.資材名,b.色,b.種類,b.サイズ,b.棚番号'   || ' FROM 部材表 a,資材項目 b,コード表 c'   || ' WHERE a.ID = b.資材ID'   || ' AND a.入数 = c.入数 AND a.重量 = c.重量 AND a.才数 = c.才数 AND a.ロケーション = c.ロケーション '   || case when sItemClass is null then '' else 'AND c.品番 = ' || sItemClass end;  out_val := 1; end; /

miruchoko
質問者

お礼

ありがとうございました。 お礼が遅くなり申し訳ございません。 今後とも宜しくお願い致します。

関連するQ&A

  • 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; どうかよろしくお願いします。

  • 動的な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.?????はないでしょうか? いろいろ調べたのですが手に負えず。 どなたか教えてください。

  • PL/SQLのOPEN cursor_name FOR文でCLOSEは必要?

    お世話になります、 Orcacleのストアドで質問があります。 以下のようなストアドを組んだ場合「Close cu1;」は必要なのでしょうか? カーソルをクローズしないとOracleエラー「カーソルが最大数を超えました。。。」というエラーが出るそうなのですが。 ちなみにClose cu1;を入れるとVBからストアドを呼んだ場合に 以下のOracleエラー 「ORA-01403:データがありません」のエラーが出てしまいます。 アドバイス等、よろしくお願いします。 CREATE OR REPLACE PACKAGE MASTERS as CURSOR c1 IS select * from userTable; TYPE type1 IS REF CURSOR RETURN c1%ROWTYPE; PROCEDURE GetD( cu1 OUT type1); end; / -- CREATE OR REPLACE PACKAGE BODY MASTERS IS PROCEDURE GetD( cu1 OUT type1) IS BEGIN OPEN cu1 FOR select * from userTable ; これが必要?→ Close cu1; END GetD; END MASTERS; /

  • PL/SQL-プロシージャ

    プロシージャBはテスト実行のため、プロシージャAを真似て作成しています。 --最後のIF文で、プロシージャAかBのどちらかに走らせたいと思っています。 DECLARE --プロシージャA--------------------------------------- PROCEDURE A IS fno1 utl_file.file_type; dnm1 varchar(200) :='XXX'; fnm1 varchar2(200) :='BBB.txt'; CURSOR cu1 is select XYZ as ABC from CCC; BEGIN fno1 := utl_file.fopen(dnm1,fnm1,'w'); FOR CU1_REC1 in CU1 loop utl_file_put_line(fno1,' '|| CU1_REC1.XYZ END LOOP; utl_file.fclose(fno1); end; --プロシージャB------------------------------------- プロシージャAと似たような処理 --プロシージャAかBかを判定するIF文------------------------------ BEGIN IF CCC.ABC = '0'; THEN A; ELSE B; ENDIF; END; /

  • PL/SQLって?

    今日からPL/SQLの本を読み始めたド素人です。。。 ありえない質問かもしれませんがどなたか助けてください! 今SQL*Plusに参考本の通り以下のコードを記述したところ エラーが発生してしまいました。 通常のSQL文とは違い普通にSQL*Plus上にコーディングするだけでは うまく機能しないのですか? それとも何か設定が必要だったりするのでしょうか? 参考本には特にそのような記述もなくサイトなどから調べても 自分ひとりではどうも解決できません。 ご協力よろしくお願いします! SQL> PROCEDURE PROC_A( 2 a IN NUMBER 3 b IN NUMBER, 4 c OUT NUMBER) 5 /  ↓  エラー内容  ↓ PROCEDURE PROC_A( * 行1でエラーが発生しました。: ORA-00900: SQL文が無効です。

  • [PL/SQL]REFCURSORが戻り値のプロシージャについて

    [PL/SQL]REFCURSORが戻り値のプロシージャについて お世話になってます タイトルの内容について、親プロシージャより引数を受け取り 子プロシージャでカーソルをオープンして、そのカーソルを親に戻す。 というプロシージャなのですが、親から実行した場合には問題ないのですが 子をSI ObjectBrowserから実行すると[実行][デバッグ]共に 押した瞬間に止まってしまいます。 下記にソースを記述します --カーソル変数の定義 CREATE OR REPLACE PACKAGE LC7BDEV.PKG_TEST_CURSOR IS  TYPE TEST_TYPE IS RECORD  (COL1 TABLE1.COL1%TYPE ,   COL2 TABLE1.COL2%TYPE ); TYPE CUR_TEST IS REF CURSOR RETURN TEST_TYPE; END; --親プロシージャ CREATE OR REPLACE PROCEDURE PD_TEST  (   in_COL_KEY IN TABLE1.COL_KEY%TYPE  ) IS  TEST_REC  PKG_TEST_CURSOR.CUR_TEST;  TEMP_COL1 TABLE1.COL1%TYPE;  TEMP_COL2  TABLE1.COL1%TYPE; BEGIN  PD_TEST_KO(in_COL_KEY,TEST_REC);  loop   fetch TEST_REC into TEMP_COL1,TEMP_COL2;   exit when TEST_REC%notfound;   dbms_output.put_line(TEMP_COL1 || ',' || TEMP_COL2);  end loop;    close TEST_REC; END; --子プロシージャ CREATE OR REPLACE PROCEDURE PD_TEST_KO  (   in_COL_KEY  IN  TABLE1.COL_KEY%TYPE ,   in_TEST_REC OUT PKG_TEST_CURSOR.CUR_TEST ,  ) IS BEGIN  OPEN in_TEST_REC FOR   SELECT COL1,COL2   FROM TABLE1   WHERE COL_KEY = in_COL_KEY END;

  • Sql developerについての質問

    Sql developerについての質問 いつもお世話になります。 私はオラクル初心者で、オラクル11gを使用しています。 現在、Sql developerでpl/sql(ストアドプロシージャー)を 作成しています。 そして、躓いておりますのは、select内の構文で条件式を書いて いるのですが、そこでコンパイルエラーになってしまっています。 オラクルは、ifではなくdecodeを使うのか、又は条件式の内容が悪いのか 又は長すぎるのかご教示頂きたく、宜しくお願い致します。             記 decode ((a.最大在庫-(b.場内在庫-b.引当数量))>0, a.最大在庫-((TRUNC(b.場内在庫/b.入数,0))*b.入数)AS 補充数量,'-'), (a.最大在庫-(a.最大在庫-((TRUNC(b.場内在庫/b.入数,0))*b.入数))) AS 補充梱包数量,

  • PL/SQLのエラーについて

    こんばんは。PL/SQLのエラーについて質問させて頂きます。 現在、Oracle8.1.7のデータベースを使用したオラクルのE-business Suiteという人事系システムで開発をしています。 そこで、SQL*Plusを使用してPL/SQLのパッケージをコンパイルしたところ、パッケージ仕様部も本体部もコンパイルのエラーは出なかったのですが、E-business SuiteにPL/SQLを設定し、動作させようとしたら、下記のようなエラーが発生しました。 -------------------------------------------------------------------- FDPSTP 内のOracleエラー 6550 原因: ORA-06550: 行 1、列 7: PLS-00221: 'ZT_TYOUHYOU_HENSEI_PKG'がプロシージャではないか、または未定義です。 ORA-06550: 行 1、列 7: PL/SQL: Statement ignored が原因で FDPSTP に失敗しました。 --------------------------------------------------------------------- また、作成したPL/SQLパッケージの仕様部は下記のとおりです。 -------------------------------------------------------------------- CREATE OR REPLACE PACKAGE APPS.ZT_TYOUHYOU_HENSEI_PKG AS FUNCTION get_henseihyo_kbn (i_grade IN VARCHAR2,o_hensei_kbn OUT VARCHAR2) RETURN NUMBER; <・・・・・中間部分は省略・・・・・> PROCEDURE main_shori (p_process_date IN VARCHAR2, p_location IN VARCHAR2); END ZT_TYOUHYOU_HENSEI_PKG; -------------------------------------------------------------------- 原因だと思われる心当たりの部分も探してみたのですが、このエラーの意味は何なのか、原因はどこにあるのか分かりません。 どなたかお判りの方、御回答よろしくお願い致します。

  • SQL文でどこが悪いのか教えて下さい

    初心者ですが教えて下さい。 表Aと表Bで表Aに含まれていないものを表Cに入れたいのですが、下記のやり方では表Aのものしか入れることができません。 どこが悪いのか教えて下さい。 ・コードは複雑なため、簡略化しています。UNIONは使わない方向で。 CREATE OR REPLACE PROCEDURE SAMPLE IS CURSOR SELLINE1 IS SELECT * FROM A ORDER BY KEY1,KEY2; CURSOR SELLINE2 IS SELECT * FROM B ORDER BY KEY1,KEY2; CNT1 NUMBER; CNT2 NUMBER; BEGIN SELECT COUNT(*) INTO CNT1 FROM C; IF CNT1 = 0 THEN FOR SELREC IN SELLINE1 LOOP INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END LOOP; FOR SELREC IN SELLINE2 LOOP SELECT COUNT(*) INTO CNT2 FROM C WHERE (KEY1 = SELREC.KEY1) AND (KEY2 = SELREC.KEY2); IF CHK_CNT2 = 0 THEN INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END IF; END LOOP; END IF; END; /

  • shellからストアドプロシージャの呼び出し

    shellからストアドプロシージャにinパラメータを渡し、 outパラメータに値やエラーコード等を戻す際、 shellの変数でそのまま受け取ることは可能でしょうか? shellでエラーコードなどのoutパラメータを受け取る 一般的な方法を教えてください。