[20250226]sqlplus sql脚本注意参数1之类的定义.txt

来源:这里教程网 时间:2026-03-03 21:36:21 作者:

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

相关推荐