plpgsqlのエスケープ文字について

このQ&Aのポイント
  • plpgsqlのエスケープ文字について教えてください。
  • nameフィールドの値をtitleフィールドに更新する関数を作成していますが、nameフィールドには「90's」や「men's」のような値が入ったレコードがあるためエラーとなってしまいます。
  • name内の「'」をエスケープする方法を教えてください。
回答を見る
  • ベストアンサー

plpgsqlのエスケープ文字について

plpgsqlのエスケープ文字について教えてください tblのテーブルのnameフィールドの値をtitleフィールドに更新する関数を作成してます。 cur cursor for SELECT id, name FROM tbl; rec RECO RD; begin open cur; LOOP FETCH cur INTO rec; EXIT WHEM NOT FOUND; w_sql := ''UPDAT tbl SET title = ''; w_sql := w_sql ll '' ''''タイトル: '' ll rec.name ll '' '''' ''; w_sql := w_sql ll '' WHERE id= '' ll rec.id= '' ll rec.id ; EXECUTE w_sql; END LOOP; ・ ・ ・ ・ ・ 上記のようにnameフィールドの値をset句に設定していますが、 nameフィールドには 「90's」 や「men's」 のような値が入ったレコードがあるためエラーとなってしまいます。 name内の「'」をエスケープする為にはどのように書けばよいでしょうか 教えてください

noname#141015
noname#141015

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

  • ベストアンサー
  • tomaju
  • ベストアンサー率76% (84/110)
回答No.1

quote_literal 関数は役に立ちますか? 中の引用符をエスケープするだけでなく、 値を引用符で囲むところまでやってくれるようです。 http://www.postgresql.jp/document/9.0/html/functions-string.html

noname#141015
質問者

お礼

回答ありがとうございました

関連するQ&A

  • ORA-06502のエラー

    以下のPL/SQLを実行すると、ORA-06502:数値または値のエラーとでます。途中までは、INSERTできるのですが、IF文の180個目くらいでエラーになります。そのあたりをCur1の宣言時にWhereで指定するとうまくいきます。 DECLARE CURSOR Cur1 IS SELECT MOJI FROM A_TBL ; CNT NUMBER(10); KAKKO_FL NUMBER(1); BEGIN CNT := 0; KAKKO_FL :=0; FOR Cur_Rec1 IN Cur1 LOOP FOR S IN 1 .. LENGTH(Cur_Rec1.MOJI) LOOP IF(ASCII(SUBSTR(Cur_Rec1.MOJI,S,1)) = 33129) THEN /*33129は'('*/ EXECUTE IMMEDIATE ' INSERT INTO EDD.test1116 VALUES( ''' || Cur_Rec1.MOJI || ''' ) '; END IF; END LOOP; END LOOP; END; なにがなんだか、さっぱりわからないので、どうか、ご教授ください。

  • PL/SQLにてカーソル名を変数に

    PL/SQLにて、カーソル名を変数にしたいのですが、どうすればよいのでしょうか? 具体的には以下のとおりです。 DECLARE CURSOR Cur1 IS SELECT K1,K2 FROM EMP; BEGIN FOR Cur_Rec1 IN Cur1     Cur_Rec1.K1 DBMS_OUTPUT.PUT_LINE(Cur_Rec1.K1); ★ END LOOP; END; ★の部分の「Cur_Rec1.K1」を「Cur_Rec1.K2」として、置き換えて使用したいのです。(2回書きたくない) 初心者で、申し訳ないです。どうか、ご教授ください。

  • Insertの質問

    いつもお世話になっております。 Oracle11gとC#.NETで開発している初心者です。 ストアドプロシージャによるテーブルからテーブルへの インサートがうまくいかず悪戦苦闘しております。 下記の様な記述をしており、コンパイルは通ったのですが、 D売上見通台帳のIDをプライマリーキーにしており、 実際.NETで動かしてみると、一意制約違反でエラーとなって しまいます。 どなたかご親切な方ご教授頂きたく、 宜しくお願い申し上げます。       記 create or replace procedure dbInsert台帳追加 ( out_val out pls_integer ) as cursor cur is SELECT 注文主,受注NO,売上日,品番,品名,数量, 登録日時,登録者 FROM D売上台帳 WHERE 売上日 = TO_CHAR(sysdate,'YYYY/MM/DD') ; cur_rec cur%rowtype; begin open cur; loop fetch cur into cur_rec; exit when cur%notfound; INSERT INTO D売上見通台帳 ( ID,注文主,受注NO,売上日,品番,品名,数量, 登録日時,登録者,更新日時,更新者 ) VALUES ( seqD売上台帳ID.nextval,cur_rec.注文主,cur_rec.受注NO,cur_rec.品番,cur_rec.品名, cur_rec.数量,cur_rec.登録日時,cur_rec.登録者,cur_rec.更新日時,cur_rec.更新者 ) ; end loop; close cur; out_val := sql%rowcount; end;

  • PL/SQL)Functionの引数(文字列)をWHERE文に記述する方法

    PL/SQLで、Functionの中で実行するselect文のWhereに、Functionの 引数で受けとった値をセットしようとしています。 この引数が文字列(VARCHAR2型)の場合、どのようにWHEREで、記述したらよいのでしょうか? ご教授のほどをよろしくお願いします。 CREATE OR REPLACE FUNCTION Fn_TBL_AAA (psCODE IN VARCHAR2) IS CURSOR TBL_AAA_CUR IS SELECT * FROM TBL_AAA WHERE BBB = psCODE ; TBL_AAA_REC TTBL_AAA_CUR%ROWTYPE;       :       : ※上記のように記述すると、実行ではエラーが発生しないのですが、  取得したい結果が返ってきません。TABLE(TBL_AAA)のBBBは、  VARCHAR2なので、通常のSQL*PLUSのSELECT文ではBBB = psCODE  はBBB = 'psCODE'のように [']で括るのですが、PL/SQLの  FUNCTION内ではどのように記述すればよいのかが  わかりません。 以上、よろしくお願いいたします。

  • PL/SQLでテーブル名に変数を使いたい

    下記のようにV_TABLE_NAMEに不定のテーブル名で使用したい ご存知の方は教えて頂けないでしょうか?V_TABLE_NAMEに取得したテーブルをセットし、データの件数を取得するPL/SQL CURSOR C_CUR IS SELECT COUNT (*) FROM V_TABLE_NAME; BEGIN for ・・・・・ loop ・・・  ・・・ V_TABLE_NAME := GET_TABLE;  OPEN C_CUR;  FETCH C_CUR into w_count; CLOSE C_CUR; end loop;

  • カーソルループ内部でログを出力

    DECLARE CURSOR EMP_CUR IS SELECT SALARY FROM EMP WHERE DEPT_NO = 10 FOR UPDATE; BEGIN FOR EMP_REC IN EMP_CUR LOOP DBMS_OUTPUT.PUT_LINE( '変更前:' || EMP_REC.SALARY ); --SALARYが2500以下なら100を加える IF EMP_REC.SALARY < 2500 THEN UPDATE EMP SET SALARY = SALARY + 100 WHERE CURRENT OF EMP_CUR; DBMS_OUTPUT.PUT_LINE( '処理件数:' || SQL%ROWCOUNT ); END IF; DBMS_OUTPUT.PUT_LINE( '変更後:' || EMP_REC.SALARY ); END LOOP; END; / 上記のようなSQLで、 変更前のSALARYと変更後のSALARYを出力したいのですが、 変更前と変更後のEMP_REC.SALARYで、同じ値が出力されました。 処理の前後でSELECTする事は可能であると思いますが、 カーソル内でまとめて行いたいです。 カーソル内でIF文の前後の値を出力する事は可能でしょうか? また、もう1点質問があります。 それは、SALARYの値が、どちらも更新された値が出力される事についてです。 例:DEPT_IDが10で、SALARYが1000の従業員が居た場合。   変更前:1100   変更後:1100 EMP_REC.SALARYの値が、DECLAREで定義されたカーソルのデータならば、 1000が出力されると考えたのですが、 どちらも更新後の値が出力されるのは何故でしょうか? お手数をお掛け致しますが、よろしくお願い致します。

  • PL/SQLで変数へ値の代入

    PROCEDURE TEST(PI_ABC IN A_TABLE.A_CODE%TYPE) IS CURSOR CUR IS SELECT A_CODE FROM A_TABLE; BEGIN --抽出したデータを代入 FOR REC_CUR IN CUR LOOP PI_ABC := REC_CUR.A_CODE; END LOOP; 上記のコードを実行すると ORA-06502:数値または値のエラー PL/SQL: 文字列バッファが小さすぎます。 とエラーが出ます。 このプロシージャを呼び出す時にも同じテーブル同じ項目を渡しています。 同パッケージ内で同じ事をやっているのに特定のプロシージャだけ 上記のエラーが出てしまいます。 環境:Windows2003Server oracle9i

  • 【PL/SQL】CURSOR ・・・ IS SELECT・・・FOR UPDATE が機能しない

    カーソルの宣言で、FOR UPDATE を指定しているのに、 WHERE CURRENT OF での更新が効きません。 エラーは発生せず、全件分ループも回っているのですが、値がまったく書き換わっていません。 Oracle Ver. = Oracle8i Release 8.1.6.0.0 CREATE OR REPLACE FUNCTION TEST_FNC RETURN BOOLEAN IS todofu_cd NUMBER(2) := 0; strSQL VARCHAR2(2000) := ''; CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE; BEGIN For cur_rec In cur Loop DECLARE BEGIN SELECT TODOFU_CD INTO todofu_cd FROM M_POST WHERE POST_NO = cur_rec.POST_NO; EXCEPTION When NO_DATA_FOUND Then todofu_cd := 0; END; UPDATE TEST_TBL SET TODOFU_CD = todofu_cd WHERE CURRENT OF cur; COMMIT; End Loop; EXCEPTION  (省略) END; / 「CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE;」の部分は、 「CURSOR cur IS SELECT POST_NO, TODOFU_CD FROM TEST_TBL FOR UPDATE OF TODOFU_CD; 」と記述しても結果は同じでした。 上書きしようとしている値である「todofu_cd」にきちんと望む値が格納されていること、ループが正常に回り、各行にアクセスしていることは、確認済です。 原因が分かる方がいらっしゃいましたらご教授下さい。 また、質問の内容に不備があるようでしたら、ご指摘下さい。 以上、どうかよろしくお願い致します。

  • ORACLE INSERT文を教えて下さい

    いつもお世話になっております。 以下のような処理を実現したいのですが、どうしてもいい方法が見つかりません。 実現するINSERT文を教えて頂けないでしょうか? よろしくお願いいたします ー処理ー TBL_Aを1レコードづつ読み込み、グループ情報のあるVIEWよりview_GRPCD取得し、TBL_Bへ出力する。 但し、グループ情報には、以下のように同一TENCDに対して複数のグループがヒットする為、日付の降順、 グループコードの降順で一番最初にヒットしたレコードのGRPCDを採用する。 【TBL_A】 │TENCD │SYOCD │URIAGE│ ┼───┼───┼───┼ │10100 │ 0100 │1,000 │ │10200 │ 0100 │2,000 │ │10300 │ 0300 │3,000 │ │22200 │ 0200 │2,200 │ 【View】 │NO│GRPCD │TENCD │ YMD │ ┼─┼───┼───┼───┼ │01│ 010 │10100 │02/01 │ │02│ 010 │10200 │02/01 │ │03│ 010 │10300 │02/01 │ │04│ 020 │10200 │01/01 │ │05│ 030 │10100 │05/01 │→TENCD:10100はこれを採用 │06│ 030 │10300 │03/01 │→TENCD:10300はこれを採用 │07│ 040 │10100 │03/01 │ │08│ 040 │10200 │03/01 │→TENCD:10200はこれを採用 │09│ 040 │10300 │03/01 │ │10│ 050 │10400 │05/01 │ 下記のほうに記載しているSQLで作成されるTBL_Bは以下のようになります 【TBL_B】(誤り) │TENCD │GRPCD │SYOCD │URIAGE│ ┼───┼───┼───┼───┼ │10100 │ 030 │ 0100 │1,000 │ │10200 │ 040 │ 0100 │2,000 │ │10300 │ 030 │ 0300 │3,000 │ 本来TBL_Bは以下のようにView上に存在しないTBL_Aのレコードでも出力させたく 以下のような結果を求めたいと思っています。 【TBL_B】(正解) │TENCD │GRPCD │SYOCD │URIAGE│ ┼───┼───┼───┼───┼ │10100 │ 030 │ 0100 │1,000 │ │10200 │ 010 │ 0100 │2,000 │ │10300 │ 010 │ 0300 │3,000 │ │22200 │ 000 │ 0200 │2,200 │※※※このレコードを作成することが出来ません※※※ ※SQLにある「NVL(View_GRPCD,0)」でVIEW上にないレコードの場合、GRPCDにゼロをセットして  出力できるかと思ったのですが、VIEW上にないレコードは作成されませんでした。  これを実現する方法を教えて頂きたいと思います。 ■TBL_B(誤り)は作成できるSQL CURSOR CUR_A IS SELECT TENCD,SYOCD,SUM(URIAGE) FROM TBL_A GROUP BY TENCD,SYOCD ORDER BY TENCD,SYOCD; BEGIN OPEN CUR_A; LOOP FETCH CUR_1 INTO w_TENCD, w_SYOCD, w_URI; EXIT WHEN CUR_A%NOTFOUND; INSERT INTO TBL_B( SELECT w_TENCD, NVL(View_GRPCD,0), w_SYOCD, w_URI FROM (SELECT View_TENCD,View_WRICD,View_GRPCD, RANK() OVER(PARTITION BY View_TENCD ORDER BY View_YMD DESC, View_GRPCD DESC) w_RANK FROM View WHERE View_TENCD = w_TENCD) WHERE w_RANK = 1); END LOOP; CLOSE CUR_A;

  • mysql_insert_id()の使い方

    過去記事を参照させていただいたのですが、 値を取ってくることができず修正点がわかりません。 アドバイスいただければと思いますのでお願いします。 テーブルは 「userid」「user_name」「bil_id」「bil_name」 で、「user_name」「bil_id」「bil_name」は、 他から「in1」~で読み込んでいます。 //SQL $sql= "insert into user set user_name=($_POST["in1"]),bil_id=・・・(略) $rec=mysql_insert_id(); print($rec); 書き方に不明な点が多いですがコメントよろしくお願いします。

    • ベストアンサー
    • PHP