プロシージャ作成時の文字コード、改行コードの影響

(8.0.22)

yum install epel-release
yum install nkf


vim a.sql

drop procedure proc1;
delimiter //
create procedure proc1()
begin

-- コメント
select 'あ';
select 'い';
select 'う';
end//
delimiter ;


nkf -w -Lu a.sql > utf8.sql
nkf -s -Lw a.sql > sjis.sql

cat utf8.sql
cat sjis.sql
od -c utf8.sql
od -c sjis.sql


source utf8.sql
source sjis.sql

show create procedure proc1\G
call proc1();

SJIS、CRLFの場合、エラーにならないが文字化けする
→UTF8、CRLFの場合、エラーなく実行できる。ソースに\rは入らない

 

(19c)

yum install epel-release
yum install nkf


vim a.sql

create or replace procedure proc1 as
val varchar2(10);
begin

-- コメント
select 'あ' into val from dual;
dbms_output.put_line('val=' || val);
select 'い' into val from dual;
dbms_output.put_line('val=' || val);
select 'う' into val from dual;
dbms_output.put_line('val=' || val);

exception when others then
raise;
end;
/

nkf -w -Lu a.sql > utf8.sql
nkf -s -Lw a.sql > sjis.sql

cat utf8.sql
cat sjis.sql
od -c utf8.sql
od -c sjis.sql

@utf8.sql
@sjis.sql

select text from dba_source
where owner = 'TEST'
and name = 'PROC1'
order by owner,name,line;

set serveroutput on
exec proc1;

SJIS、CRLFの場合、エラーにならないが文字化けする

→UTF8、CRLFの場合、エラーなく実行できる。ソースに\rは入らない

 

(13)

dnf --enablerepo=powertools install nkf

vim a.sql

create or replace procedure proc1()
language plpgsql
as $$
declare val varchar(10);
begin

-- コメント
select 'あ' into val;
raise notice 'val= %', val;
select 'い' into val;
raise notice 'val= %', val;
select 'う' into val;
raise notice 'val= %', val;

exception when others then
raise;
end;
$$;

 

nkf -w -Lu a.sql > utf8.sql
nkf -s -Lw a.sql > sjis.sql

cat utf8.sql
cat sjis.sql
od -c utf8.sql
od -c sjis.sql


\i utf8.sql
\i sjis.sql


select prosrc from pg_proc
where proname = 'proc1'
;
call proc1();

SJIS、CRLFの場合、プロシージャ作成時にエラー
psql:sjis.sql:18: ERROR: invalid byte sequence for encoding "UTF8": 0x83

→UTF8、CRLFの場合、エラーなく実行できるが、ソースに\rが入る

 

(2019)
https://www.atmarkit.co.jp/ait/articles/1301/25/news092.html

 

notepad a.sql

create or alter procedure proc1
as
begin try

-- コメント
select 'あ';
select 'い';
select 'う';
end try
begin catch
select
error_number()
, error_severity()
, error_message()
, error_line();
end catch


nkf32 -w -Lu a.sql > utf8.sql
nkf32 -s -Lw a.sql > sjis.sql

notepad utf8.sql
notepad sjis.sql


sqlcmd -E -S localhost -d test -i utf8.sql
sqlcmd -E -S localhost -d test -i sjis.sql


select definition from sys.sql_modules
where object_id = object_id('proc1')
;

exec test.dbo.proc1;

→UTF8、LFの場合、エラーにならないが文字化けし、1行目で出力が止まる

SJIS、LFの場合、正しく実行できる