• ベストアンサー

PL/SQL

PL/SQL(Oralce)で、NVARCHAR2の変数を宣言した場合、その変数への代入方法を教えてください。 Hensu NVARCHAR2; と宣言し、 Hensu := N'テスト'; とした場合、コンパイルエラーとなりませんが、 Hensu  NVARCHAR2; Hsensu1 VARCHAR2; と宣言し、 Hensu := N || Hsensu1; とした場合、”識別子Nを宣言してください。”旨のコンパイルエラーが出力されていしまいます。 OracleはR8.1.7です。 よろしくお願いします。

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

  • ベストアンサー
  • Haizy
  • ベストアンサー率40% (404/988)
回答No.3

三度、失礼。 下のまんまじゃ、あんまりにもわかり辛いので・・・。(^^;;; Hensu := (select convert(NVARCHAR2, :Hsensu1) from dual); で、ダメでしょうか? ORACLEの場合は、dual がダミーテーブル(なはず)です。 これで、SQL文が成立しますので、変数に、値が格納されると思うのですが。 でわでわ

hori_hori
質問者

お礼

どうもです。 SQLの組み込み関数(convert)を使ってやってみました。 しかし、以前と同様にキャラクタセットの不一致でエラーとなってしまいました。 →キャラクタセットの設定方法が違うのでしょうか??? それで、他の組み込み関数はないかとあれこれ探したところTRANSLATEという関数を使ってみました。 Hensu := TRANSLATE(Hensu1 USING NCHAR_CS); →'NCHAR_CS'でNCHARやNVARCAR2で使用するキャラクタセットを設定できるとのことです。 するとエラーなしでコンパイルできました。 Haizyさんのヒントのおかげでなんとか前に進むことができました。 色々アドバイスしていただいてありがとうございました。 感謝いたします。

その他の回答 (2)

  • Haizy
  • ベストアンサー率40% (404/988)
回答No.2

再び。 そうですか、だめですかぁ~~。残念( ̄- ̄; コンバート関数を、ダミーテーブルで・・・・ select convert(NVARCHAR2, :Hsensu1) from dual で、だめですかね?

  • Haizy
  • ベストアンサー率40% (404/988)
回答No.1

こんにちは。 あぁ~PL/SQL、うろおぼえ~~~で、自身無しですが・・・ Hensu := N || Hsensu1; || パイプ って、文字列結合でしたよね? なので、この命令って、 Nという変数内の文字 と Hsensu1 という変数内の文字を結合して、Hensuに入れろですよね。 NVARCHAR2 ← VARCHAR2 の受け渡しって、そのまま直で、渡せませんでしたっけ? Hensu := Hsensu1; ひょっとして、日本語(2バイト文字)化けちゃいます?

hori_hori
質問者

補足

回答ありがとうございます。 NVARCHAR2 ← VARCHAR2 の受け渡しって、そのまま直で、渡せませんでしたっけ? Hensu := Hsensu1; 上記のように、受け渡すと’キャラクタセットが違います’といった旨のコンパイルエラーが出てしまいます。 そこで、試験的に色々やってみて Hensu := N'テスト'; がうまくいったので(SQL*PLUSのUPDATEにおいて、NVARCHAR2への更新は'N'をつけるようです)、 Hensu := N || Hsensu1; といったちょっと浅はかなことをしているのです。 うーん、基本的にPL/SQLでVARCHAR2の変数はつかえないのでしょうか?(そんなことはないと思うけど)

関連するQ&A

  • 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; -------------------------------------------------------------------- 原因だと思われる心当たりの部分も探してみたのですが、このエラーの意味は何なのか、原因はどこにあるのか分かりません。 どなたかお判りの方、御回答よろしくお願い致します。

  • PL/SQLでのSQL文法

    こんにちは。教えてください。 PL/SQLを使うのが初めで戸惑っています。 まず、PROCEDUREで =========================== BEGIN SELECT NAME FROM TABLE1 WHERE NAME='tanaka'; END; / =========================== このように書いて実行させようとすると、「コンパイルエラー」 「INTO句はこのSELECT文に入ります」というエラーが出ます。 SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに?? ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて わかりませんでした。 PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。 よろしくお願いいたします。

  • PL/SQLでPLS-00201のエラー

    初めて質問させていただきます。 よろしくお願いいたします。 Oracle 9i から 11g へバージョンアップしました。 9iでは動いていたPL/SQLコマンドが11gでは 以下のようなエラーが大量に発生します A_FLG Aシノニム名.列名%type ,      * 行16でエラーが発生しました ORA-00201:行16、列13: PLS-00201:識別子(シノニム名).(列名)を宣言してください。 PROCEDURE D_FLG_UPD ( a in varchar2 ) is type D_TYPE is record ( J シノニム名.列名.列名%type ,    ここでエラー   → A_FLG Aシノニム名.列名%type , B_FLG Bシノニム名.列名%type , C_FLG Cシノニム名.列名%type ); G H; begin これはどういった場合に発生するエラーなのでしょうか? またOracleのバージョンによってPL/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の変数について

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

  • PL/SQLのコンパイル

    PL/SQLで書いた構文をコンパイルしようとしたら 「キーワードがありません」というコンパイルエラーが出ます。 キーワードとはいったい何をさしているのでしょうか。 ご存知の方がいましたらご教授ください。お願いいたします。

  • PL/SQLとMS SQLServerの違いを教えてください

    SQLを学ぼうとしているのですが。。。 概要で煮詰まってしまいました;; SQLはRDBMSにおいてのデータベース言語で、直接データベースに宣言を実行でき、PL/SQLはOracle社が開発した、手続き型に組み込めるSQLで、 MS SQLServerは。。。? Oracle SQLは。。。? と、調べれは調べるほどに、訳が分からなくなってきました; PL/SQLとMS SQLServerの違いはなんなのでしょうか? Oracle SQLとSQLは別物と考えてよいのでしょうか? 使用できるOSが違うのか、組み込める言語が特定されているのか、具体的な違いが判らず、どのような条件下で使用したらよいのかわかりません。 お手数ですがご解答よろしくお願いいたします。

  • PL/SQLのIN演算子で使う文字列の宣言について

    PL/SQLの変数の宣言の仕方について質問です!! PL/SQLで変数と変数の使用について質問があります。 PL/SQL内部でUPDATEなどを分を作成する際の、その要素を使用部に変数で格納したいと思ってい ストアドを作成していました。 例えば: update tableA set columnA = 'aaaaaa' where columnA not in ('c1','c2','c3') and columnA like 'c%'; というを --仕様部-- afterset varchar2(100) :='aaaaaa'; --変換したい値 nochg_before varchar2(100) := 'C1'',''C2'',''C3'; --特定で変換してはいけないもの beforeset varchar2(100) := 'c%'; --変換したい対象 --本体部-- update tableA set columnA = afterset where columnA not in (nochg_before) and columnA like beforeset; で、作成して実行した際に、なぜか「特定で変換してはいけないもの」 も一緒に更新をかけていました。 おそらく、2番目の変数の宣言に問題があり、レコードが除外できなかったと思うのですが、 正しい書き方とはどうすればいいのでしょうか? お力を貸してください。 お願いします。

  • PLSQLでのSQLの実行に関しての質問

    [環境] db:oracle 11g express edition os:windowsXP 言語:PLSQL [質問] PLSQLを使用したプログラムを作成していたのですが、SQLの文字数がVARCHAR2(32767)で宣言した変数の文字数を超えてしまいエラーとなります。 理由としては、引数で受け取った配列の数分だけUNIONでSQLを結合し、変数に格納しているのですが、配列の量が多いと変数の最大文字列を超えてしまうようです。(ソースイメージは下記に記述) 対応としては、変数を分割し、SQLを実行することや、SQLを組みなおすなどの対応が考えられるのですが、”(1)処理速度の都合上、できれば1度のSQLで実行したい。”、”(2)抽出条件が配列の条件によって、複雑に変わることと、既に稼働しているプログラムの為あまりソースを変更したくない”という理由から検索条件は変えずに、1度のSQLでどうにか実行できないかと考えています。 上記条件をクリアする何か良い方法はありますでしょうか? (もし、1回のSQLで実行は難しいのであれば、最悪配列を使用してSQLを分割して対応しようとは思っています。ただ、他に方法があるのであればそれに越したことはないです。) どなたか良い方法をご存知の方がおりましたら教えていただけないでしょうか? 宜しくお願い致します。 [ソースイメージ] <引数> 配列[100];          <-- 条件が格納された配列 <変数定義部> hensu_union VARCHAR2(32767); <-- 結合したSQLを格納 hensu_where VARCHAR2(1000); <-- SELECTの条件の格納 <プログラム部>  <省略>  .  .  .   FOR i IN 1..配列分 LOOP <-- 配列の数分、UNIONでSQLを結合 IF i > 1 THEN hensu_union := hensu_union || 'union '; END IF; hensu_union := hensu_union || 'select A,B,C .... from マスタA、マスタB WHERE ' || hensu_where ;  ←ここのUNIONで結合しすぎると最大文字列を超えエラー  END LOOP; . .  省略 . .   OPEN カーソル名 FOR hensu_union ; ←SQLを実行する部分でどうにか1回で済ませたい。                    VARCHAR2を超えるような文字列を格納できたり、                    他の良い方法はあるのか?

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

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

    • ベストアンサー
    • Java