• ベストアンサー

PL/SQLの初歩的な質問

失礼します。 PL/SQLについて、初歩的な質問をさせてください。 DBに以下のような文字列が入っていて、 それを抽出し変数にセットするとします。 A'1234567'→変数aにセット B'  12A345B'→変数bにセット 質問1 Aの文字列を取得した際、'123-4567'のように 間にハイフンを付けて変数aにセットする場合 どのようなPL/SQLの記述になりますか? 質問2 Bの文字列を取得した際、'12345'のように 左側の空欄と数字以外の文字を取り、 なおかつ数字を半角にして変数bにセットする場合 どのようなPL/SQLの記述になりますか? お手数お掛けしますが ご回答宜しくお願いします。

noname#107189
noname#107189
  • Oracle
  • 回答数2
  • ありがとう数7

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

  • ベストアンサー
  • Myuu4
  • ベストアンサー率34% (36/103)
回答No.1

おはようございます。 1.は既に解決済みかもしれませんが。 1. a := SUBSTR(A,1,3) || '-' || SUBSTR(A,4,4); ※3文字と4文字に区切る場合 2. 左側の空欄を取るのであれば、関数がありますので、以下で可能です。 b := LTRIM(B); が、 ・数字以外の文字を取る ・半角にする 関数はないと思いますので、何かしらのロジックを考える必要があるのではないでしょうか。 例えばですが、 REPLACE('A','') と、'A'をNULLに置換することができると思いますが、それを、考えられる文字列全てに対して行います。 そのロジックを、関数にしてしまうことも手だと思います。

noname#107189
質問者

お礼

回答ありがとうございました。 2につきましては関数を作って対応する方向にしようと思います。

その他の回答 (1)

回答No.2

質問2: 無理やり感が漂っていますが、こんな感じでできました。 select LTRIM(TRANSLATE('  12A345B','1234567890 '||TRANSLATE('  12A345B','12345678901234567890',' '),'1234567890 '),' ') AS KEKKA from dual --------結果-------- KEKKA 12345 正規表現(REGEXP_SUBSTR)等を使った綺麗な回答が 他にあると思うのでそれまでのつなぎにどうぞ。

noname#107189
質問者

お礼

回答、ありがとうございました! 参考にさせてもらいます^^

関連するQ&A

  • PL/SQLのグローバル変数保持期間

    PL/SQLのグローバル変数の保持期間についての質問です。 例えば、 パッケージA、 パッケージBが あったとします。 パッケージBには グローバル変数BH、 ファンクションBF があります。 パッケージAからファンクションBFを呼び出します。ファンクションBFの処理で、グローバル変数BHに文字列"こんにちは"をセットします。 ここからです。パッケージAからグローバル変数BHを使用するとき、文字列"こんにちは"は保持されたままなのでしょうか? ファンクションBFで戻り値、又はOUTで呼び出し側パッケージAに返せばいいのですが、訳ありでできません。 このような状況なので、パッケージBのグローバル変数を見ようと考えています。 ファンクションBFは共通関数なので、BFの処理でBHにセットせず、ファンクションAのグローバル変数にセットすることもできません。 ファンクションBFは色々なファンクションから呼び出されているためです。 Java等はインスタンスの概念があるので、上記のような処理は問題ないのですが、PL/SQLでこのような方法は可能でしょうか? 皆さん、お忙しい中申し訳ございませんが、よろしく お願いします。 又、他に良い方法がありましたら、アドバイスお願いします。

  • PL/SQLの変数について

    困っています。 ホスト引数で :NAME = "あいうえお" としてoracleに渡し、 PL/SQLでNAMEという変数で受け取った後、 Xという変数にその"あいうえお"を'あいうえお' のように、シングルクォーテーションで囲んで入れたいのです。 ですが、 NAME = 'X' としたら文字列として認識してしまい、 NAME = ''X'' としたらPLS-00103のエラーが出てしまいます。 シングルクォーテーションで囲んだ文字列を変数にセットする場合はどのように書いたら宜しいのでしょうか??

  • PL/SQLに関しての質問です。

    はじめまして。 PL/SQLの入門書を一冊程度読んで開発に携わってしまった初心者です。 どうしてもわからず、行き詰ってしまったので質問させて下さい。 現在あるパッケージを作成しています。 例えとして、パッケージ内にプロシージャAとプロシージャBが有るとします。 プロシージャA内で、SELECTにてDBから取ってきた値を変数Cに入れます。 その変数Cはパッケージの呼出し元のモジュールに返します。 ここまでは解りますが問題はここからです。 プロシージャAで変数Cに格納した値を、そのままプロシージャBでも使用したいのです。 変数Cを仕様部で宣言して、グローバル変数として使用すれば楽だと思うのですが、 グローバル変数は一切使用してはならない。と言われています。 ご回答お待ちしております。

  • PL/SQLでの文字列比較

    PL/SQL内の条件文で以下のような文字列比較は出来ないでしょうか? (1)ある変数に指定文字列が含まれるかどうか (PASCALで言うところのPOS関数のような) (2)ある変数が指定文字列で始まる・終わるかどうか (JAVAで言うところのstartWith,endWithのような) 調べたところ、(1)に関しては[instr]関数が使えそうだったのですが、文法エラーとなってしまいました。 どなたかお分かりになる方、よろしくお願いします。

  • 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】SQL文が長すぎてSELECTできない

    oracle9iのpl/sqlでSELECT文を発行し 取得したカーソルを返す処理をしています。 where句が動的になる為 実行するSQL文が長くなり ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます。が発生しました のエラーが発生します。 そこで、SQL文の部分をCLOB型にしたり SQL文を「||」でつなげたり してみましたが、どちらもエラーになりました。 長すぎるSQL文を実行するには どうしたらよいでしょうか? 以下ソースです。(左側の数字は行数です) ----------------------------------- 1 PROCEDURE テスト(O_カーソル IN OUT 情報カーソル) IS 2 TYPE curType IS REF CURSOR; 3 tmpCur curType; 4 sqlStr VARCHAR2(32767); 5 6 7 BEGIN 8 9 sqlStr := 'SELECT ' 10 sqlStr := sqlStr || 'A,B ' 11 sqlStr := sqlStr || 'FROM' <<省略>> 12 OPEN tmpCur FOR sqlStr ←エラー発生 13 O_カーソル := tmpCur; --取得したカーソルを返す 14 END テスト; ----------------------------------- (1)SQL文をCLOB型にしてみる:コンパイルエラー 4 sqlStr CLOB (2)SQL文を「||」でつなげてみる:文字列バッファが小さすぎますでエラー Dim sqlStr1 VARCHAR2(32767); Dim sqlStr2 VARCHAR2(32767); Dim sqlStr3 VARCHAR2(32767); <<省略>> 12 OPEN tmpCur FOR (sqlStr1      || sqlStr2      || sqlStr3 <<省略>> )

  • PL/SQLを使った開発について質問があります。

    PL/SQLを使った開発について質問があります。 私は、Java(eclipse)を使用して開発を経験しております。 そこで質問があります。 eclipseを使ってPL/SQLの開発は可能でしょうか? また、可能な場合ですが、以下の条件を達成できますか? ・プロシージャが多くても、一発で目的の位置にジャンプしたい ・プロシージャの呼び出し元へジャンプしたい ・変数の宣言へジャンプしたい ・変数名の変更時などに自動リファクタリングしてほしい 等です。 どうか、ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • PL/SQLでのSQLエラーログの出力について

    PL/SQLでのSQLエラー発生時のログ出力について教えていただきたいことがあります。 既存のシステムで、メインからAの処理を呼び出し、さらにAからBの処理を呼び出している処理で、 エクセプション処理がメインにしか記述されていないものがありました。 この場合、処理Aや、処理BでSQLでエラーが発生した時は、 メインでエラーログが出力されると思いますが、 何か特定特別なケースの場合、きちんと異常が認識できない等の問題はないでしょうか? お手数をおかけしますが、よろしくお願いします。

  • PL/SQLについての質問です。

    PL/SQLについての質問です。 カーソルデータ(emp_rec(i))を、TABLE変数(emp_ins(i))に代入して、代入されたTABLE変数を使用して、DML処理を行うことは可能ですか? エラーを解読し対処を行っても、エラーが発生してしまいます。 どうか、ご教授お願いします。 下記を実行すると、下記エラーが発生します。 -実行結果------------------------------------ DECLARE * 行1でエラーが発生しました。: ORA-06502: PL/SQL: 数値または値のエラーが発生しました ORA-06512: 行127 -エラー番号解読----------------------------------------- ●エラー名: PL/ SQL: 数値または値のエラーstring が発生しました ●原因: 算術、数値、文字列、変換または制約エラーが発生しました。たとえば、NULL 値をNOT NULL で宣言した変数に割り当てようとした場合、または100 以上の整数をNUMBER( 2) で宣言した変数に割り当てようとした場合にこのエラーが発生します ●処置:値が制約違反をしないように、データ、操作方法または宣言方法を変更してください。 -ソース------------------------------------ DECLARE --カーソル定義 CURSOR emp_cur IS SELECT a,b,c FROM emp TYPE emptabtype IS TABLE OF emp%ROWTYPE INDEX BY PLS_INTEGER; emp_rec emptabtype; /* 処理対象データ格納変数 */ -- insert作業用 emp_ins emptabtype; ins_count NUMBER := 1; BEGIN /* empカーソルオープン・フェッチ・クローズ */ OPEN emp_cur; FETCH emp_cur BULK COLLECT INTO emp_rec; CLOSE emp_cur; /* (挿入)処理対象のデータを、処理対象データ格納変数に格納する。 */ FOR i IN emp_rec.FIRST..emp_rec.LAST LOOP --挿入するレコードを格納 emp_ins(ins_count) := emp_rec(i); ins_count := ins_count + 1; END LOOP; /* DML処理 */ -- 挿入する FOR count_ins IN emp_ins.FIRST..emp_ins.LAST LOOP INSERT INTO temp VALUES(emp_ins(count_ins).a ,emp_ins(count_ins).b ,emp_ins(count_ins).c); END LOOP; COMMIT; END; /

  • 一括でINSERTする方法(PL/SQL)

    PL/SQLを利用して、下記3つのSQLを一括でinsertしたいと思います。 (値は、任意でありません。) PL/SQLに関して、初心者なので、どのように記述してよいか 分かりません。 サンプル的なソースを用いて解説して頂けるとありがたいです。 (1)INSERT INTO tb1(列1, 列2) VALUES('値1','値2') (2)INSERT INTO tb1(列1, 列2) VALUES('値3','値4') (3)INSERT INTO tb1(列1, 列2) VALUES('値5','値6')