• 締切済み

LONG型の先頭250バイトを Varcharとして取得できますか?

お世話になります。 Long型列の先頭250バイトが欲しいのですが Select Substr(FIELD01, 1, 250) from TABLE01 とすると、 ORA-00932 が返ってきてしまいます。 なにかいい方法ありませんでしょうか? できれば、PL/SQLは使いたくなく、別テーブルをCreate Table as Selectも避けたいです。

  • Oracle
  • 回答数3
  • ありがとう数3

みんなの回答

回答No.3

こんにちは。 >>やっぱ、諦めざるをえないですかね。。。 そうですね・・・。 いったんLOBに変更できてしまえば、DBMS_LOB.SUBSTR()でもできますが、 このTO_LOB()が厄介で・・・。 (普通のSELECTでは使えないんですよね~) PL/SQLが駄目ということですが、自作関数レベルならいいのではないでしょうか? それでよければ具体例など提示しますが・・・。

kurinkurinkurin
質問者

補足

taka451213さん 返信遅くなり申し訳ありません。 ご回答ありがとうございます。 考え見ると、ご指摘の通り、自作関数レベルならいい気がします。 差し支えなければ、具体例をご教示いただけませんでしょうか?

回答No.2

こんにちは。 すみません、やってみたら無理でしたね・・・。 >>できれば、PL/SQLは使いたくなく、別テーブルをCreate Table as Selectも避けたいです。 どちらかを諦めるしかないようです・・・。^^;

kurinkurinkurin
質問者

お礼

回答ありがとうございます。 そうですか、やっぱ、諦めざるをえないですかね。。。

回答No.1

こんばんは。 多分・・・、 Select Substr(TO_CHAR(FIELD01), 1, 250) from TABLE01 ですか。 関係ないですが、LONGは使用しない方がいいですよ。

kurinkurinkurin
質問者

お礼

ありがとうございます。 残念ですが、TO_CHARで ORA-00932が発生していまいます。 ご指摘の通り、LONGは使用したくないんですが、既にあるテーブルが もうLONGでできていて、そこにアクセスする追加処理を作る必要が生じ いかんともしがたい状況です。

関連するQ&A

  • ORA-14459: GLOBALキーワードがありません。

    ORA-14459: GLOBALキーワードがありません。 以下のSQLを実行したところエラーになりました。 GLOBALキーワードとは何でしょうか?原因を教えてください。 SQL> CREATE TEMPORARY TABLE TEST AS SELECT SYSDATE FROM DUAL; CREATE TEMPORARY TABLE TEST AS SELECT SYSDATE FROM DUAL * 行1でエラーが発生しました。: ORA-14459: GLOBALキーワードがありません。 ORACLE 10g Windows 2008

  • 無名ブロック内でのDDL実行について

    環境は Linux + oracle 10g R2です。 簡単な無名プロシージャを書いていてはまって しまいました。 分かる方でしたら、あっというまに指摘していただけそうなので こちらに質問しました。 無名ブロック内で以下の事を行いたいのですが、うまく動作を確認できません。 ※以下は意味の無い処理となっていますが、今回説明用に短くしてみました。 ◇実現したい事 1.CREATE TABLE文の実行 (ここではEX01テーブルを作成します) 2.CREATE したテーブルにたいしてINSERT 3.CREATE したテーブルのDROP ◇私の実行結果 $ sqlplus scott/tiger@orcl SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01'; レコードが選択されませんでした。 -- 私の思いでは以下のプロシージャは正常に動作するのでは? -- と思うのですが、以下の通りエラーとなってしまいます。 -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))'); 3 INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); 4 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01'); 5 END; 6 / INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); * 行3でエラーが発生しました。: ORA-06550: 行3、列13: PL/SQL: ORA-00942: 表またはビューが存在しません。 ORA-06550: 行3、列1: PL/SQL: SQL Statement ignored -- -- なので、処理を分割して行ってみました。 -- まずはCREATE TABLEのみ -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))'); 3 END; 4 / PL/SQLプロシージャが正常に完了しました。 -- -- CREATE TABLEは正常に動作したようです。 -- SQL> INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); 1行が作成されました。 -- -- INSERT文も正常に動作したようです。 -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01'); 3 END; 4 / PL/SQLプロシージャが正常に完了しました。 -- -- なんとDROP TABLEも正常に動作したようです。 -- SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01'; レコードが選択されませんでした。 SQL> そうなんです。3行まとめて記載するとエラーとなるのですが、 上記の通りそれぞれ分けて実行すると正常に動作するのです。 これはどこが悪いのでしょうか? 情けない事に、今日の午後はこれでほとんどつぶれてしまいました。 どなたか助けてください。 以上よろしくお願いします。

  • フィールドのサイズの取得

    varchar(40)でCREATE TABLEしたテーブルから、40という部分を取得する方法を教えてください。 rsを利用して40を取得できないでしょうか? sql = "CREATE TABLE shain (usrname varchar(40),,," dbc.Execute(sql) sql = "SELECT * FROM shain" set rs = dbc.Execute(sql)

  • viewの性能

    あるテーブルがあって、Viewがそのままテーブルを参照してます。 そのViewをそのまま参照しているViewが階層的にあるとします。 テーブルA ← View1 ← View2 ← View3 [SQL的イメージは] ・creat table テーブルA (・・・) ・create view1 as select * from テーブルA ・create view2 as select * from view1 ・create view3 as select * from view2 質問したい事として、 View1 を参照するのとView3を参照するのは、View1を参照するのが 階層化が無い分、速いのでしょうか? それともそのまま参照している場合、あまり速さは変わらないのでしょうか?

  • 集計結果を検索対象にするには?

    MySQL 4.0.16です。 create temporary table TABLE_B as select FIELD_1,sum(FIELD_2) from TABLE_A; というように、TABLE_Aから集計した結果をTABLE_B作成と同時に挿入しています。 create table~as selectでは、selectで指定したフィールド名が継承されるとの事で、新規作成&挿入されたTABLE_Bのフィールド名は"FIELD_1","sum(FIELD_2)"というフィールド名が自動で付与されます。(desc temp でフィールド名は確認しました) 続くSQL文でTABLE_Bの"sum(FIELD_2)"が条件検索の対象になるのですが、where sum(FIELD_2)条件 ではgroup by の使い方が間違っている、というエラーになってしまいます。 どのように解決したらよいか悩んでいます。アドバイスを頂ければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • SELECT文の二段重ね

    次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。

  • PL/SQLのCREATE文でCHAR型で項目ができない

    PL/SQLで以下のようにCREATE文を発行しました。 Bテーブルの項目 項目1,'1'を持つテーブルを作成したいのです。 DECLARE  KBN CHAR(1);  WK_SQL VARCHAR2(4000); BEGIN  KBN := '1';  WK_SQL := 'CREATE TABLE A_TBL AS    SELECT B.項目1 , ' || KBN || ' AS A項目    FROM B_TBL B ' ;  EXECUTE IMMEDIATE WK_SQL; END; 結果はA_TBLの項目、A項目がどうしてもNUMBER型になるのです。初心者で、質問に不備なところもあるかもしれませんが、どうすればよいか、ご教授ください。

  • PHP varcharからintへの変換

    varcharで取得したカラム「ID」のMAX値に+1して、DBに登録させようとしています。 ・DB の項目  ID varchar(7) ・ IDの内容 A000001、A000002・・・ ・ソース $sql = "select cast(substr(max(ID),2,6) as unsigned integer)+1 from テーブル名"; $res = $conn->query($sql); $row = $res->fetchRow(); $mem_id_mx = ?????;  =>変数 $mem_id_mx にどのような形でMAX+1値を代入すればよいのでしょうか?     また、"A" の先頭への付加とゼロパディングの方法が分からず非常に困っております。 どなたかご回答頂けますと幸いです。

    • ベストアンサー
    • PHP
  • joinの場合のテーブル名の別名の使用方法

    select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください

  • Select Distinctについて

    SQL文の質問です。フィールドがTable1に100つあるとします。 select distinct XYZ From Table1という文があるとします。 これだとXYZのフィールドしか参照していないことになると思います。 そうではなくて、他の99フィールドの値も参照(データにアクセスしたい)したいと思っています。 select distinct XYZ, * From Table1とSelect * from Table1みたいなことをやりましたがエラーが発生しました。他の99フィールドを参照する方法はあるでしょうか?