• ベストアンサー

PLSQLについて

初心者の質問でほんとうにほんとうに申し訳ありません。 PLSQLでお伺い致しのですが、 例えば、もしaというパラメータがNULLだった場合に、 b_procというプロシージャを呼び出すという処理があったとして、 その呼び出したプロシージャのINパラメータを、NULLとして取得したい時の記述として、   IF a is NULL THEN b_proc(INパラメータ);    INパラメータ =: null;  ENDIF; という記述方法は正しいでしょうか? どなか教えて頂けませんか? よろしくお願い致します。

  • aaadd
  • お礼率60% (6/10)

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

  • ベストアンサー
  • Go_Ahead
  • ベストアンサー率67% (21/31)
回答No.2

補足ありがとうございます。 これじゃダメですか?。 begin if (a is null) then b_proc(null); end if; end; またパラメーターがどっから来るのか分からないので、 begin   if (a is null) then pi_prc_param := null ; b_proc(pi_prc_param); end if; end; こんなのとかでしょうか?。 上記2つは結果は同じです。

aaadd
質問者

お礼

なるほど。 教えて下さってありがとうございます。 助かりました!

その他の回答 (1)

  • Go_Ahead
  • ベストアンサー率67% (21/31)
回答No.1

上記でやりたい事って何でしょう?。 文法的には問題無いですし、IN パラメーターを変数として使いまわしたりする (奨励出来ませんけど)場合は再初期化して使ったりもしますが…。 正しい、正しくないのジャッジは例題では分かりません。 b_proc() のパラメータはどこで初期化されているのでしょう?。 もう少し詳細な補足があれば、回答もつくのではないでしょうか。

aaadd
質問者

補足

上記でやりたい事は、b_proc()を呼び出した際に、 INパラメータをNULLとして、b_proc()を取得したいという事だと思います。 あとパラメータはどこにも初期化はされていません。

関連するQ&A

  • MySQL5.0のストアドプロシージャで引数の使い方がわからなくて困っています。

    MySQL5.0のストアドプロシージャで引数の使い方がわからなくて困っています。 ストアドプロシージャで IF文で引数の空の判定と、 LIKE '%name%'にその引数を使いたいのです。 どなたかわかるかたいらっしゃいませんか? □プログラムからコールする strSQL = "CALL buttonaction_proc2(syohinCd, syohinCdLast, name, count) "; □ストアドプロージャ delimiter // CREATE PROCEDURE buttonaction_proc2(IN syohinCd INT(8), IN syohinCdLast INT(8), IN name VARCHAR(40), IN count INT(8)) IF ((syihinCd IS NOT NULL) OR (syohinCdLast IS NOT NULL) OR (name IS NOT NULL)) THEN AND (SYOHIN_CD BETWEEN syohinCd AND syohinCdLast) ELSE (IF syohinCd IS NOT NULL) THEN AND (SYOHIN_CD BETWEEN syohinCd AND count) ELSE IF (syohinCdLast IS NOT NULL) THEN ( AND (SYOHIN_CD BETWEEN 1 AND syohinCdLast) ) IF (name IS NOT NULL) THEN AND NAME LIKE '%name%' END IF END IF ORDER BY SYOHIN_CD; END //

  • MYSQL ストアドプロシージャの記述方法

    MYSQLのストアドプロシージャについて分からないことがあり質問させて頂きます。 SQLのwhere句の部分を引数によって条件分で変更させたいと考えています。そこでORACLEの場合は変数にいれて最後に明示的にSQLを発行して いたので可能だったのですが、MYSQLの場合はどういった記述になる のかわかりません。やりたいことは下記のような感じです。 ORACLEの場合は procedure prctest(pc out refcur,a in varchar2,b in varchar2) is sqldata varchar2(1000); whereinfo varchar2(1000); begin sqldata := 'select ID , NAME from testTbl '; if (a IS NOT NULL) then   whereinfo := whereinfo || ' acol = a ' ; end if; if (b IS NOT NULL) then   if (whereinfo IS NOT NULL) then  whereinfo := whereinfo || ' and ';   end if;   whereinfo := whereinfo || ' acol = b ' ; end if; if (whereinfo IS NOT NULL) then  sqldata := sqldata || ' where ' || whereinfo ; end if; open pc for sqldata; (ここでSQLが入ったSQLを発行) end prctest; (抜粋) ストアドをあまり使用したことがなく良い説明ではないかも しれませんが、アドバイスの方頂けたらと思います。 よろしくお願いします。

  • ストアドプロシージャの条件分岐に関して

    お世話になります。 以下の環境で開発を行っています。 言語:C#(.NET 2008) DB: SQL Server 2008 C#で作成した画面にて入力された値をパラメータで ストアドプロシージャに渡し、その値がNULLでない場合だけ WHERE句にレコード絞り込み条件を与えるSQL文を 考えているのですが、記述方法がわかりません。 (プロシージャ) --------------------------------------------- DECLARE @param1 = ''  -- 画面から渡されるパラメータ1 @param2 = ''   -- 画面から渡されるパラメータ2 SELECT * FROM TABLE1 A, TABLE2 B    -- (1) IF @param1 IS NOT NULL AND @param2 IS NOT NULL    -- ここから WHERE A.COLUMN1 = @param1 AND A.COLUMN2 = @param2 ELSE IF @param1 IS NOT NULL AND @param2 IS NULL WHERE A.COLUMN1 = @param1 ELSE IF @param1 IS NULL AND @param2 IS NOT NULL WHERE A.COLUMN2 = @param2              -- ここまで (2) AND A.COLUMN1 = B.COLUMN1       -- (3) AND A.COLUMN2 = B.COLUMN2      -- (4)   ------------------------------------------------ 上記の(1)から(4)までをうまく1つにまとめたかたちで記述することができません。 特に上記(2)の効率のよい正しい記述方法がわかりません。 どなたかご教授願えますか? よろしくお願いいたします。

  • T-SQL パラメータがNULLの場合条件含めず

    お世話になります。 SQL Server での T-SQLのWhere句のパラメータがNullであった場合に これをWhere句から除外したいのですが・・・ 今まで、こういう場合には、SQL文をプログラム上で作成してそのSQL文を ソースにしてきたのですが、動作速度や汎用性を考えてストアドプロシジャーを使用するのが今後の為と思いこちらで質問させていただきました。 例えば・・・条件のところから WHERE     IF @パラメータ1 Is Not Null         (dbo.TEST.A =< @パラメータ1) AND     IF @パラメータ2 Is Not Null         (dbo.TEST.B =< @パラメータ2) AND このように記述してみたのですが、WHEREが記述された後ではダメなようで・・・次に WHERE     CASE         WHEN @パラメータ1Is Not Null THEN (dbo.TEST.A = @パラメータ1) AND         WHEN @パラメータ2Is Not Null THEN (dbo.TEST.B = @パラメータ2) AND     END 上記にように記述してもやはりエラーが。 WHERE句の後にパラメータを評価し、WHERE句に含めるか、 含めないか記述するにはどうすればいいでしょうか? 初歩的な事かもしれませんが、何卒よろしくお願いいたします。

  • PLSQLで

    PLSQL(Oracle9.i)で以下のことをしようとしています。 しかし、コンパイルは通るがステップ実行すると固まります。 -- 宣言部 TYPE REC_A IS RECORD( a NUMBER, b NUMBER, c NUMBER, d NUMBER, e NUMBER, f NUMBER, g NUMBER, ); TYPE B_TBL IS TABLE OF REC_A INDEX BY BINARY_INTEGER; TYPE C_TBL IS TABLE OF B_TBL INDEX BY BINARY_INTEGER; D_TBL C_TBL; -- 関数部 FOR i IN 1..3 LOOP  FOR J IN 1..3 LOOP   D_TBL(I)(J).a := 1;   D_TBL(I)(J).b := 2;   D_TBL(I)(J).c := 3;   D_TBL(I)(J).d := 4;   D_TBL(I)(J).e := 5;   D_TBL(I)(J).f := 6;   D_TBL(I)(J).g := 7;  END LOOP; END LOOP; なにぶんまだPLSQLの勉強始めて1ヶ月満たないもので、分からないことをどう伝えればいいのかも分からない状況です。 処理的には、D_TBL(I)(J)に値をいろいろセットし集計をとりCSVにはきだす処理です。 これだけでは分からないかもしれませんが、よろしくお願いします。

  • 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; /

  • ストアドから得られるレコードセットを、別のストアドで利用したい

    現在、実行するとあるレコードセット(1行1列のみ)を返すストアドプロシージャProc_Aがありますが、このプロシージャを実行して得られる結果を、 別のプロシージャProc_Bで、以下のような形で使用したいと考えています。 ただし、Case文内部でのストアドの実行や、変数へのストアドの実行結果の代入を試しましたが、どちらもうまくいっていません。 なにか、よい解決策があれば、教えていただければ、と思います。 パターンA) Case内部で直接実行 select case Table_A.param_1 when 0 then Exec Proc_A '***','**' else '' end パターンB)いったんパラメータとして取得 declare @values as char(10) execute sp_executesql N'@values = Proc_A ''***'',''**''', N'@values char(10) OUTPUT', @values OUTPUT

  • AccessでのVB記述について

    恐らく初歩的なことと思いますが…。 Accessのイベントプロシージャから、VBの記述で IF文の条件で、not equal はどのように表現するのでしょうか? C言語でいうと if( aa != 0 ){ ・・・ } という判断をしたいのです。 equal なら If aa = 0 Then ・・・ EndIf でいいのですが。

  • PLSQLの識別子エラー

    下記PLSQLを実行した時に(sqlplus上で、@XXXX.SQLと実行) WCOUNT :=WCOUNT + 1; エラー PLS-00201: 識別子WCOUNTを宣言してください のエラーがでます 宣言をしているのですがわからず、お助けください また、他にもこのエラーを処置したあとに問題と なりそうな箇所があれば指摘お願いします -やろうとしてること (1)テーブルA を、男子を出席順に読み込んでその読み込んだ順番に 1から番号をふり、テーブルBへ新規追加する (2)テーブルAからテーブルBに新規追加していない女子を、出席順に読み込んで 1から番号をふり、テーブルBへ新規追加する (3)テーブルBのKEYは順番のみ (4)テーブルBのINSERT分は、今後機能追加する予定なのでNOT IN使用する -組んだPL/SQL(2つのINSETを1つのファイルに記述しています) DECLARE WCOUNT number; CURSOR カーソル IS SELECT 出席番号,名前,成績 FROM テーブルA  ORDER BY 出席番号; BEGIN FOR r IN カーソル LOOP INSERT INTO テーブルB (r.順番, r.名前,r.出席番号) VALUES (WCOUNT,r.名前); COMMIT; WCOUNT :=WCOUNT + 1; END LOO; / END; DECLARE CURSOR カーソル IS SELECT 出席番号,名前,成績 FROM テーブルA A WHERE A.出席番号 NOT IN (SELECT B.出席番号 FROM テーブルB B) ORDER BY 出席番号; BEGIN FOR r IN カーソル LOOP INSERT INTO テーブルB (順番, 名前) VALUES (WCOUNT,r.名前); COMMIT; WCOUNT :=WCOUNT + 1; END LOOP; / END;

  • エクセルで空白セルを空セルに

    B1にセルをおきます。A1の内容を比較します。 if A1=0 then B1を空セルに else A1をB1に代入 endif 同様にA列の内容を比較し結果をB列に格納します。 VBAではどのように記述しますか?

専門家に質問してみよう