• 締切済み
  • すぐに回答を!

ファンクション内での円マークについて

値をカンマ形式で変換するファンクションを作成しています。 ファンクションの内容は下記の通りです。 CREATE FUNCTION Test (DECIMAL) RETURNS VARCHAR(15) AS ' DECLARE arg ALIAS FOR $1; str VARCHAR(16); BEGIN str := ''''; SELECT TRIM(TO_CHAR(arg, ''\\9,999,999,999'')) INTO str; RETURN str; END; ' language 'plpgsql' ; 上記のコマンドを実行したらワーニングが出力されました。 下記が出力したワーニングの内容です。 WARNING: nonstandard use of \\ in a string literal 行 2: ' ^ HINT: Use the escape string syntax for backslashes, e.g., E'\\'. WARNING: nonstandard use of escape in a string literal 行 1: SELECT TRIM(TO_CHAR( $1 , '\9,999,999,999')) ^ HINT: Use the escape string syntax for escapes, e.g., E'\r\n'. QUERY: SELECT TRIM(TO_CHAR( $1 , '\9,999,999,999')) CONTEXT: SQL statement in PL/PgSQL function "test" near line 6 CREATE FUNCTION ※一応、ファンクションは作成できたんですで・・・ ファンクションを実行したらワーニングと結果が出力されました。 SELECT test(10000); 下記が出力したワーニングの内容です。 WARNING: nonstandard use of escape in a string literal 行 1: SELECT TRIM(TO_CHAR( $1 , '\9,999,999,999')) ^ HINT: Use the escape string syntax for escapes, e.g., E'\r\n'. QUERY: SELECT TRIM(TO_CHAR( $1 , '\9,999,999,999')) CONTEXT: PL/pgSQL function "test" line 6 at SQL statement test -------- 10,000 (1 行) 下記のように円マークの箇所にEをつけたりしましたがワーニングが解消する事はできませんでした。多分、私の記述がいけないような気がします。 すみませんがどのように記述すればいいのでしょうか。 ご教授いただけませんでしょうか。 宜しくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数848
  • ありがとう数1

みんなの回答

  • 回答No.1

バージョンが分かりませんがこんなんでとうですか。 CREATE or REPLACE FUNCTION Test (DECIMAL) RETURNS VARCHAR(15) AS $$ DECLARE arg ALIAS FOR $1; BEGIN RETURN TRIM(TO_CHAR(arg, E'FM\\9,999,999,999')); END; $$ language plpgsql;

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 説明不足で申し訳ありませんでした。 私が使用しているPostgreSQLのバージョンは下記の通りです。 PostgreSQL 8.4.9 on i386-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6), 32-bit nara1962さんのいただいたアドバイスを元に下記のようにファンクションを修正して実行したらワーニングが発生しました。 ※ワーニングが発生しましたがファンクションは作成されました。 CREATE FUNCTION test (DECIMAL) RETURNS VARCHAR(15) AS ' DECLARE arg ALIAS FOR $1; str VARCHAR(16); BEGIN str := ''''; SELECT TRIM(TO_CHAR(arg, E''FM\\9,999,999,999'')) INTO str; RETURN str; END; ' language 'plpgsql' ; 下記が出力したワーニングの内容です。 WARNING: nonstandard use of \\ in a string literal 行 2: ' ^ HINT: Use the escape string syntax for backslashes, e.g., E'\\'. CREATE FUNCTION ファンクションを実行した結果です。 ※ワーニングは出力されませんでした。 SELECT test(10000); test -------- 10,000 (1 行) 再度、アドバイスいただけませんでしょうか。 宜しくお願いします。

関連するQ&A

  • ストアドファンクションのエラーについて

    PostgreSQLでストアドファンクションを作成しました。 ファンクションの内容は下記の通りです。 CREATE FUNCTION getRenban (VARCHAR) RETURNS VARCHAR(7) AS ' DECLARE key ALIAS FOR $1; code VARCHAR(7); code2 VARCHAR(2); code5 VARCHAR(5); renban INTEGER; new_code VARCHAR(7); BEGIN SELECT MAX(code) INTO code FROM M_ITEM WHERE flg = TRIM($1); code2 := TRIM($1); IF code IS NULL THEN renban := 1; ELSE SELECT SUBSTR(code, 2) INTO code5; SELECT TO_NUMBER(code5, ''99999'') INTO renban; renban := renban + 1; END IF; code5 := ''''; SELECT TO_CHAR(renban, ''00000'') INTO code5; SELECT code2 || code5 INTO new_code; RETURN new_code; END; ' language 'plpgsql' ; コンソール上で下記のコマンドを実行したらエラーが出力されました。 SELECT getrenban('01'); 出力されたエラーの内容は下記の通りです。 ERROR: value too long for type character varying(5) CONTEXT: PL/pgSQL function "getrenban" line 19 at SQL statement お恥ずかしいですがいくらコードを見てもどこが原因なのかわかりません。 申し訳ありませんがご教授お願いできませんでしょうか。 昨日から悩んでいます。 どうか助けて下さい、宜しくお願いします。

  • String型をchar型配列にしたい

     VC++2005ExpressEdition + PlatformSDKを使用しています.  String型をchar型配列に変換したいと思っています.  自分なりに調べてみたのですが, > String^ str = gcnew String("test"); > char chr[5]; > chr = str->ToCharArray(); などとしても次のようなエラーが出ます. > error C2440: '=' : 'cli::array<Type,dimension> ^' から 'char [5]' に変換できません。  String型からchar型配列への変換はどのようにすればいいのでしょうか.

  • CSEでのデータベース作成時のエラーについて

    こんばんは。 PostgreSQLについて質問させてください。 CSEを使ってSQLの勉強をしていますが、 データベースを作成した際に、 WARNING: nonstandard use of escape in a string literal at character 42 WARNING: LOCATION is not supported anymore という表示がされ、 その後、テーブル作成などをすると エラーになり実行できません。 例えば、 create table テーブル名( id number(8) primary key, name char(10), birth date ) ; を実行した際に、 SQL実行中に以下のエラーが発生しました。 ERROR: syntax error at or near "(" at character 32 というエラーになります。 この原因は、Encodingの問題だと思っていますが、 どのように解決したらいいか教えてください。 また、Encodingの問題ではない場合は その際の対処法を教えてください。 以上、ご回答のほどお願いいたします。

  • C言語 文字列操作

    トリム関数とリムーブ関数を作成してみました。改良点はありますでしょうか? &#65374;&#65374;&#65374;&#65374;以下ソース&#65374;&#65374;&#65374;&#65374; #include <stdio.h> #include <stdlib.h> #include <string.h> char *Trim(char *str); char *Remove(char *str, char *rmv); void main(void) {  char str[10], rmv[10], *p;  int c;  /* " abcd "をトリムする */  strcpy(str, " abcd ");  printf("トリム前 |%s|\n", str);  p = Trim(str);  printf("トリム後 |%s|\n", str);  /* 指定文字列を削除する */  printf("削除する文字列を入力してください :");  scanf("%s", rmv);  Remove(str, rmv);  printf("削除後 |%s|\n", str);  exit(0); } char *Trim(char *str) {  char space[] = " ";  char null[] = "";  int index = 0;  while(1){   if(strcmp(&(str[index]), null) == 0){    index--;    if(strncmp(&(str[index]), space, 1) == 0){     strcpy(&(str[index]), &(str[index]) + 1);    }else{     break;    }   }else{    if(strncmp(&(str[index]), space, 1) == 0 && index == 0){     strcpy(&(str[index]), &(str[index]) + 1);    }else{     index++;    }   }  }  return str; } char *Remove(char *str, char *rmv) {  int c, size, i;  char *p;  c = '\0';  p = strchr(rmv, c);  size = p - rmv;  for(i = 0; i < size; i++){   c = (int)rmv[i];   p = strchr(str, c);   if (p != NULL) {    strcpy(&(str[p-str]), p + 1);   }   else{    printf("""%c""は見つかりませんでした\n", c);   }  }  return str; }

  • pg_dumpallのバックアップとリストアについて

    現在当方、postgresql-8.2.11にてDBサーバを構築しております。 そろそろ、マシン自体も古くなってきたので載せ替えをしようと 試みているのですが、うまく行きません。。。 新しいマシンにはpostgresql-8.4.0をインストールしました。 旧サーバからpg_dumpallにて全データをダンプして新サーバへ リストアしたのですが、serverlogに下記のログが出てきて、 pgadmin3の様な接続ソフトから接続できません。 WARNING: nonstandard use of \\ in a string literal at character 70 HINT: Use the escape string syntax for backslashes, e.g., E'\\'. ERROR: column c.reltriggers does not exist at character 240 STATEMENT: SELECT c.oid, obj_description(c.oid), c.relhasoids as hasoids, n.nspname AS schemaname, c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS "tablespace", c.relhasindex AS hasindexes, c.relhasrules AS hasrules, (c.reltriggers > 0) AS hastriggers, c.relacl, c.reltuples, ((select count(*) from pg_inherits where inhparent = c.oid) > 0) as inhtable FROM ((pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace))) WHERE (c.relkind = 'r'::"char") リストア後は正常にデータベースもできていますし、テーブルの内容も 問題なくリストアされているようでした。 ダンプされたファイルも秀丸にて確認してみましたが問題ないようでした。 どなたか何か情報をお持ちであれば教えてください。 よろしくお願いいたします。

  • ライブラリ関数

    文字列をコピーする(strcpy) 文字列の長さを調べる(strlen) 配列の長さを調べる(sizeof) #include <stdio.h> #include <string.h> int main(void) { char s1[128] = "ABCD"; char s2[128] = "EFGH"; char s3[128] = "IJKL"; strcpy(s2, s1); strcpy(s3, s2); puts("s1をs2にs2をs3にコピーしました。"); printf("s1 = %s\n", s1); printf("s2 = %s\n", s2); printf("s3 = %s\n", s3); printf("文字列%sの長さは%uです。\n",s3,(unsigned)strlen(s3)); printf("文字列%sの長さは%uです。\n",s3,strlen(s3)); return (0); } char *strcpy(char *d, const char *s) { while (*d++ = *s++) printf("pointer=%s \n",d); } /* 文字列sをdにコピーする[配列版] */ char *strcpy(char d2[], const char s2[]) { unsigned i=0; while (d2[i] = s2[i]){ i++; printf("hairetsu=%s\n",&d2[i]); } } /*--- 文字列strの長さを返す[ポインタ版] ---*/ size_t strlen(const char *s) { size_t len = 0; while (*s++) len++; return (len); } /*--- 文字列strの長さを返す[配列版] ---*/ unsigned strlen(const char str[]) { unsigned len = 0; while (str[len]) len++; return (len); } c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(48) : error C2084: 関数 'char *strcpy(char *,const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の前の定義を確認してください c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(68) : error C2084: 関数 'size_t strlen(const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(80) : 'strlen' の前の定義を確認してください 上記の問題が解決できません。助けてください><

  • テーブル名が可変の動的SQLをファンクションにしたい

    Oracle9iのWindowsXP環境です。 以下のようなPL/SQLを作成しましたが、同じようなselect文の繰り返しなので整理したいのと、レスポンスが悪いのでファンクションにしたいのですが、テーブル名が可変のため上手くいきません。「Table&1」は置換変数で、batファイルからパラメータが渡り、「Table200812」のように変更されます。 【***.bat】 set /p phara sqlplus -s ***/***@*** ***.sql %phara% 【***.sql】 省略 begin select aaa into a1 from Table&1 where code = 'AAAAA'; ・・ select aaa into a2 from Table&1 where code = 'BBBBB'; ・・ select aaa into a3 from Table&1 where code = 'CCCCC'; ・・ 省略 end; / 以下、試しに作成しようとしたファンクションですが、やはり予想どおりですが「表がありません」とコンパイルエラーになります。 create function Func_test(code IN varchar2, Table1 IN varchar2) return number is ret number; begin select aaa into ret from Table1 where code = 'code'; return ret; end; / ※コール側は、「a1 = Func_Test('AAAAA', Table&1);」 そもそもこれが実現できたとしてレスポンスが上がるものなのでしょうか?どちらにせよコードを整理する意味でもファンクションにはしたいのですが。。 宜しくお願い致します。

  • PHP4から5への移行に伴うFatal error:Cannot use string offset as an array というエラーについて、

    php4から5へ移行した際以下のエラーがでてしまいました、以前はうまく稼動したんですが・・・。どうしても原因がわからないのでどなたか教えていただけたら幸いです。 Fatal error: Cannot use string offset as an array in /home/.sites/106/site3/web/make_rss/lib/Init_class.php on line 344 ------------------------------------------------------ 332 $ex = "0"; 333 for($i=0; $i<$count; $i++){ 334 if($string[$i][4] == "1" or $string[$i][4] == "2"){ 335 $str[$ex][0] = $string[$i][0]; 336 $str[$ex][1] = $string[$i][1]; 337 $str[$ex][2] = $string[$i][2]; 338 $str[$ex][3] = $string[$i][3]; 339 $str[$ex][4] = $string[$i][4]; 340 $str[$ex][5] = $string[$i][5]; 341 $ex++; 342 } 343 } ---------------------------------------------------- ちなみに変数$stringは、print_r($string);で以下のように表示されます↓ Array ( [0] => Array ( [0] => 2006年10月31日PM05:59 [1] => test [2] => test [3] => test [4] => 1 [5] => 1 ) ) ---------------------------------------------------- 以上です。どうかお願いいたします。

    • ベストアンサー
    • PHP
  • select case 大文字小文字を区別しないよ

    select case 大文字小文字を区別しないようにするには? Sub test01() Dim str As String str = "A" Select Case str Case "a" MsgBox "aです" Case "A" MsgBox "aです" End Select End Sub これだと、半角全角がヒットしないのはなんとなくしょうがないかな、と思うのですが 大文字小文字がちがくてもヒットさせるにはどうすればいいですか? Sub test01() Dim str As String str = "A" Select Case str Case "a", "A" MsgBox "aです" End Select End Sub とするしかないでしょうか? 大文字小文字区別なく評価する方法があれば教えてください。よろしくお願いします。

  • 文字列のメンバ変数を外部変数のように扱いたい

    済みません。質問なのですが、 メンバ変数を外部変数のように扱うにはどうしたらよいのでしょうか? int型などの場合、 class test{ static const int a; }; const int test::a = 10; とすればよいですよね? これをcharの配列にして class test{ static char a[7][32]; }; char test::a[0] = "test"; とすると サイズが0の配列を割り当てまたは宣言しようとしました というコンパイルエラーがでてしまいます…。 多次元配列の場合はstatic変数としてもてないのでしょうか? char** として宣言してもどこでnewを行えばよいか解りません。 コンストラクタの中で行えば そこでstaticではなくなってしまいますし…。 後、できればstringクラスの配列で持ちたいのですが #include <string> class test{ static string test[7]; }; string test::test[0] = "aaa"; なんてことができますでしょうか? 質問内容が解りにくいかも知れませんが どうか教えてください。 宜しくお願いいたします。