[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));

posted @ 2025-02-27 20:27  lfree  阅读(12)  评论(0)    收藏  举报