ITPub博客

首页 > 数据库 > Oracle > [20240930]建立完善calcz.sql脚本.txt

[20240930]建立完善calcz.sql脚本.txt

原创 Oracle 作者:lfree 时间:2024-10-01 21:08:52 0 删除 编辑

[20240930]建立完善calcz.sql脚本.txt

--//tpt脚本有1个calc.sql脚本,可以做一些10,16进制计算,带入参数必须显示说明10,16进制,我利用hd.sql脚本代码生成更加灵活
--//的代码,自己也写一个看看。

1.环境:
SCOTT@book01p> @ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.测试:
SCOTT@book01p> @ calc xa0 + 10

                                DEC                  HEX
----------------------------------- --------------------
                         170.000000                   AA

SCOTT@book01p> @ calc xa0 + a
    to_number(substr('a',instr(upper('a'),'X')+1), p3.format) calc_dec,
              *
ERROR at line 22:
ORA-01722: invalid number

--//calc代码如法识别a表示16进制。

3.代码如下:
$ cat calcz.sql
-- Copyright 2023 lfree. All rights reserved.
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms and conditions.
--------------------------------------------------------------------------------
--
-- File name:   calcz.sql
-- Purpose:     Basic calculator and dec/hex converter
--
-- Author:      lfree
--
-- Usage:       @calcz <num1> <operation> <num2>
--              @calcz 10 + 10
--              @calcz a + 0x10
--              @calcz 0xFFFF - 0x5F
--              @calcz xBB * 1234
-- Other:
--              Can calculate only 2 operands a time
--              if the string contains 0x, a,b,c,d,e,f return hex
--
--------------------------------------------------------------------------------
set termout off
define vc=&1
col n1 new_value _tpt_n1

column text format a20
column hex_status format a10
SELECT text
      ,n10 n1
      ,REPLACE (TO_CHAR (n10, LPAD ('x', 16, 'x')), ' ') c16
      ,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));


define vc=&3
col n2 new_value _tpt_n2

column text format a20
column hex_status format a10
SELECT text
      ,n10 n2
      ,REPLACE (TO_CHAR (n10, LPAD ('x', 16, 'x')), ' ') c16
      ,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));
set termout on

COL calc_dec HEAD "DEC" FOR 999999999999999999999999999.999999
COL calc_hex HEAD "HEX" FOR A20 JUSTIFY RIGHT
COL calc_hex1 HEAD "HEX1" FOR A20 JUSTIFY RIGHT

whenever sqlerror exit failure rollback

select &_tpt_n1 &2 &_tpt_n2 calc_dec
, TO_CHAR (&_tpt_n1 &2 &_tpt_n2, 'FM0xxxxxxxxxxxxxxx') calc_hex
, upper(TO_CHAR (&_tpt_n1 &2 &_tpt_n2, 'FM0xxxxxxxxxxxxxxx')) calc_hex1
from dual ;

4.简单测试:
SCOTT@book01p>  @calcz 10 + 10

                                DEC                  HEX                 HEX1
----------------------------------- -------------------- --------------------
                          20.000000 0000000000000014     0000000000000014

SCOTT@book01p> @calcz a + 0x10

                                DEC                  HEX                 HEX1
----------------------------------- -------------------- --------------------
                          26.000000 000000000000001a     000000000000001A

SCOTT@book01p> @calcz a + 10x

                                DEC                  HEX                 HEX1
----------------------------------- -------------------- --------------------
                          26.000000 000000000000001a     000000000000001A

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3035027/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7971214