[20250226]sqlplus sql脚本注意参数1之类的定义.txt
[20250226]sqlplus sql脚本注意参数1之类的定义.txt
--//在调式sql脚本遇到的问题,浪费一点时间,做一个记录。
--//我以前写过一个脚本实现10进制,16进制相互转换的脚本,参考 [20240928]10,16进制转10,16进制的sql脚本.txt
--//这样改写一些脚本带入hash值可以10进制,16进制,我以前改写时将hd.sql代码写入对应脚本里面的,现在改写为直接调用。
--//在改为直接调用的过程中,遇到的问题,参数1被覆盖了,提醒自己以后调试这类代码注意这个问题。
--//通过一个简单的例子说明问题。
SCOTT@book01p> define 1=1111
SCOTT@book01p> define 2=aaaa
SCOTT@book01p> define 1
DEFINE 1 = "1111" (CHAR)
SCOTT@book01p> define 2
DEFINE 2 = "aaaa" (CHAR)
SCOTT@book01p> @ hd &&2
TEXT N10 C16 U16 HEX_STATUS
-------------------- ----------------- -------------------------------- -------------------------------- ----------
aaaa 43690 aaaa AAAA hex
SCOTT@book01p> define 2
DEFINE 2 = "aaaa" (CHAR)
SCOTT@book01p> define 1
DEFINE 1 = "aaaa" (CHAR)
--//可以发现参数1被覆盖了,要减少原来的改动,要先使用1个参数保存对应参数1,调用完成后再保存回去。
--//例子如下:
define tt='&&1'
@ hd &&2
define 2=&&v_n10
define 1='&&tt'
--//另外注意一个问题如果参数1带入'',直接写define tt=&&1会报错。
SCOTT@book01p> define 1=''
SCOTT@book01p> define tt=&1
SP2-0137: DEFINE requires a value following equal sign
SCOTT@book01p> define tt='&1'
SCOTT@book01p> define tt="&1"
SCOTT@book01p> define tt
DEFINE TT = "" (CHAR)
--//加入单双引号就可以了。
--//实际上只要调用@ hd 任何参数,参数1都会覆盖,简单验证:
SCOTT@book01p> define 1=1111
SCOTT@book01p> define 2=aaaa
SCOTT@book01p> define tt=&2
SCOTT@book01p> @ hd &tt
TEXT N10 C16 U16 HEX_STATUS
-------------------- ----------------- -------------------------------- -------------------------------- ----------
aaaa 43690 aaaa AAAA hex
SCOTT@book01p> define 1
DEFINE 1 = "aaaa" (CHAR)
SCOTT@book01p> define 2
DEFINE 2 = "aaaa" (CHAR)
--//参数1一样会被覆盖。
--//顺便贴上改写的hd.sql脚本:
$ cat hd.sql
-- Copyright 2023 lfree. All rights reserved.
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms and conditions.
--------------------------------------------------------------------------------
--
-- Name: hd.sql
-- Purpose: display hex or dec to hex or dec
--
-- Author: lfree
-- Usage:
-- @ hd <hex|dec>
--
--------------------------------------------------------------------------------
define vc=&1
column text format a20
column hex_status format a10 new_value v_hex_status
column n10 format 9999999999999999 new_value v_n10
column c16 format a32 new_value v_c16
column u16 format a32 new_value v_u16
SELECT text
,n10
,REPLACE (TO_CHAR (n10, LPAD ('x', 16, 'x')), ' ') c16
,upper(REPLACE (TO_CHAR (n10, LPAD ('x', 16, 'x')), ' ')) u16
,hex_status
FROM (SELECT '&&vc' text
-- ,DECODE ( hex_status ,'hex', TO_NUMBER ( SUBSTR ('&&vc', INSTR (LOWER ('&&vc'), 'x',-1) + 1) ,'xxxxxxxxxxxxxxxx') ,'dec', TO_NUMBER ('&&vc') ,0) n10
,DECODE ( hex_status ,'hex', TO_NUMBER ( replace (lower('&&vc'), 'x') ,'xxxxxxxxxxxxxxxx') ,'dec', TO_NUMBER ('&&vc') ,0) n10
,hex_status
FROM (SELECT CASE
WHEN REGEXP_LIKE (LOWER ('&&vc'), '^[0-9]+$') THEN 'dec'
WHEN REGEXP_LIKE (LOWER ('&&vc') ,'^0?[xX]?[0-9a-f]+[xX]?$') THEN 'hex'
ELSE 'other'
END AS Hex_Status
FROM DUAL));
--//在调式sql脚本遇到的问题,浪费一点时间,做一个记录。
--//我以前写过一个脚本实现10进制,16进制相互转换的脚本,参考 [20240928]10,16进制转10,16进制的sql脚本.txt
--//这样改写一些脚本带入hash值可以10进制,16进制,我以前改写时将hd.sql代码写入对应脚本里面的,现在改写为直接调用。
--//在改为直接调用的过程中,遇到的问题,参数1被覆盖了,提醒自己以后调试这类代码注意这个问题。
--//通过一个简单的例子说明问题。
SCOTT@book01p> define 1=1111
SCOTT@book01p> define 2=aaaa
SCOTT@book01p> define 1
DEFINE 1 = "1111" (CHAR)
SCOTT@book01p> define 2
DEFINE 2 = "aaaa" (CHAR)
SCOTT@book01p> @ hd &&2
TEXT N10 C16 U16 HEX_STATUS
-------------------- ----------------- -------------------------------- -------------------------------- ----------
aaaa 43690 aaaa AAAA hex
SCOTT@book01p> define 2
DEFINE 2 = "aaaa" (CHAR)
SCOTT@book01p> define 1
DEFINE 1 = "aaaa" (CHAR)
--//可以发现参数1被覆盖了,要减少原来的改动,要先使用1个参数保存对应参数1,调用完成后再保存回去。
--//例子如下:
define tt='&&1'
@ hd &&2
define 2=&&v_n10
define 1='&&tt'
--//另外注意一个问题如果参数1带入'',直接写define tt=&&1会报错。
SCOTT@book01p> define 1=''
SCOTT@book01p> define tt=&1
SP2-0137: DEFINE requires a value following equal sign
SCOTT@book01p> define tt='&1'
SCOTT@book01p> define tt="&1"
SCOTT@book01p> define tt
DEFINE TT = "" (CHAR)
--//加入单双引号就可以了。
--//实际上只要调用@ hd 任何参数,参数1都会覆盖,简单验证:
SCOTT@book01p> define 1=1111
SCOTT@book01p> define 2=aaaa
SCOTT@book01p> define tt=&2
SCOTT@book01p> @ hd &tt
TEXT N10 C16 U16 HEX_STATUS
-------------------- ----------------- -------------------------------- -------------------------------- ----------
aaaa 43690 aaaa AAAA hex
SCOTT@book01p> define 1
DEFINE 1 = "aaaa" (CHAR)
SCOTT@book01p> define 2
DEFINE 2 = "aaaa" (CHAR)
--//参数1一样会被覆盖。
--//顺便贴上改写的hd.sql脚本:
$ cat hd.sql
-- Copyright 2023 lfree. All rights reserved.
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms and conditions.
--------------------------------------------------------------------------------
--
-- Name: hd.sql
-- Purpose: display hex or dec to hex or dec
--
-- Author: lfree
-- Usage:
-- @ hd <hex|dec>
--
--------------------------------------------------------------------------------
define vc=&1
column text format a20
column hex_status format a10 new_value v_hex_status
column n10 format 9999999999999999 new_value v_n10
column c16 format a32 new_value v_c16
column u16 format a32 new_value v_u16
SELECT text
,n10
,REPLACE (TO_CHAR (n10, LPAD ('x', 16, 'x')), ' ') c16
,upper(REPLACE (TO_CHAR (n10, LPAD ('x', 16, 'x')), ' ')) u16
,hex_status
FROM (SELECT '&&vc' text
-- ,DECODE ( hex_status ,'hex', TO_NUMBER ( SUBSTR ('&&vc', INSTR (LOWER ('&&vc'), 'x',-1) + 1) ,'xxxxxxxxxxxxxxxx') ,'dec', TO_NUMBER ('&&vc') ,0) n10
,DECODE ( hex_status ,'hex', TO_NUMBER ( replace (lower('&&vc'), 'x') ,'xxxxxxxxxxxxxxxx') ,'dec', TO_NUMBER ('&&vc') ,0) n10
,hex_status
FROM (SELECT CASE
WHEN REGEXP_LIKE (LOWER ('&&vc'), '^[0-9]+$') THEN 'dec'
WHEN REGEXP_LIKE (LOWER ('&&vc') ,'^0?[xX]?[0-9a-f]+[xX]?$') THEN 'hex'
ELSE 'other'
END AS Hex_Status
FROM DUAL));