仕事メモとか

仕事中に調べた情報とか知ったことをメモしています。
unixコマンド, vim, oracle, putty, postgresql, bash, EXCEL, python, SQL全般 など。
最近は tableau, movabletype とかも触ったりしています。
雑な読書感想とかはこちら

カテゴリ: oracle


久々にoracle触って、listaggでデータを横連結しようと思ったらエラー。

 ORA-02000: missing WITHIN keyword

within group の指定が必須だったので改めて調べました。必須でした。
ということで調査用のメモを残しておきます。

within group ({order by のルール})

select listagg(dat,' ') WITHIN GROUP (order by dat asc nulls last)
from(
select 'A' as dat from dual
union
select 'B' as dat from dual 
union
select 'C' as dat from dual 
)

参考:
https://www.shift-the-oracle.com/sql/aggregate-functions/listagg.html
このエントリーをはてなブックマークに追加

ORA-01489: result of string concatenation is too long が出た


プログラムを流用しようと思って使ってみたら、エラーが出てました。
見てると普通にoraエラー。

他に使ってるやつなので不思議に思っていたのですが、
実行したやつはデータ件数が多くなる形になっていました。
プログラムをよく見ると、SQLを動的に作っている。

データが増えるのとともに、SQL自体が動的にでかくなる→SQL文字数的にエラー

って言うコンボだったようです。
動的に作ってる部分がわかりづらくて時間を食ったのですが、そもそも作り上げたSQL自体をechoとかしてれば一発で気付けた話。


このエントリーをはてなブックマークに追加

 ORA-00933: SQL command not properly ended が出た

いやもう、すごい簡単な話なんですが。
もらったSQLを実行してみたらなんかエラーになりました。
エラーコードはSQLコマンドが終了してないよ、っていうやつ。

SQLを良くみると、1つだけシングルコーテーションが違う。


update {table}
set a = 'a data'
      , b = ’b data’ ←ここだけ文字が良くみると違う
where c = 'c data'

みたいに、良く見ないとわからない状態になっていました。
こういうのはSQLツールで色分けしていると確かにわかりやすいので、
一旦SQL自体をツールに入れてみると一目瞭然。


このエントリーをはてなブックマークに追加


oracleの正規表現で少しハマった話_REGEXP_REPLACE

URLを含むjsonの一部のデータを抜き出したい、ってことよくありますよね。
そういうときに力を発揮するのが正規表現。

なんですが、どうも上手くいかなくて苦労した話です。
結果的に上手くいったんですが。

例)
データ:[{"url":"https://data.net/dat/?data_id=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","
...

後ろは延々と続きます。
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
のデータ部分が抜き出したいものです。
jsonに入ってるので、いろんなデータがありますが、このデータ自体は幸いjsonでも頭のほうに入っていました。

で、成功したSQLはこちら。

select regexp_replace(data_json, '.*sid=(.+?)\".*', '\1') as out_data
from data_table;

これで上手くいきました。


そして、失敗したのがこちら。

select regexp_replace(data_json, '.*sid=(.*?)\".*', '\1') as out_data
from data_table;

はい、取ってくる中を+から*に変更したものです。
原因はちゃんと見てないのですが、0件で最短マッチが成立してしまって上手く動かなかったのかな? と。
データ自体は必ず入っているのが確定しているデータなので今回はこれで困らないのですが、
もうちょっと原因が分かったほうがいい気が。



参考:
https://docs.oracle.com/cd/E16338_01/appdev.112/b56259/adfns_regexp.htm#CHDDGICJ
このエントリーをはてなブックマークに追加


oracle SQL Developer で文字をエスケープしようとしたときの話

はい、ちょっと環境が変わってSQL Developer使っています。
SQLで文字列を出すときに&(の半角)みたいなのって特殊文字扱いになるのですが、

select 'aaa & bbb' as dat from dual;

とすると、
「BBB:を入力せよ」みたいになります。
空で実行すると、こうなります。

aaa null

&BBBと解釈され、空がnullになるのでこうなったようです。

ちなみに、DBeaverで実行すると普通に実行されるので、
oracleとかSQLの仕様じゃなく、SQL Developerの仕様のようです。

それじゃエスケープすればいいのかな、と。思ってバックスラッシュとかいろいろやってみました。

select 'aaa \& bbb' as dat from dual;
select 'aaa && bbb' as dat from dual;
select '{aaa & bbb}' as dat from dual;

が、ダメでした。

調べた結果、以下の方法くらいしかなさそうでした。


1.&の後ろに文字指定をしない(後ろを別文字列として結合)
select 'aaa &' || ' bbb' as dat from dual;

2.設定変更
SET DEFINE OFF

3.chr(38)で出す
select 'aaa ' || chr(38) || ' bbb' as dat from dual;


ツールでちょっと見たい、が、作ったSQLを他でも流用したい、
みたいなときは、chr(38)にしておくと無難かと思います。



参考:
http://output-place.blogspot.com/2013/05/sqlplus.html
https://code-examples.net/ja/q/115aca
このエントリーをはてなブックマークに追加

↑このページのトップヘ