Oracle PLSQL 将数字转为对应的英文单词

用途
    将数字转为对应的英文单词,技术写代码可引用这一段
使用场景
    发票、对账单等处输出金额

命令如下,可点击sql查看,下面的内容直接贴出来似乎不能直接编译。
/*  FUNCTION money_format_us(p_money_amount IN NUMBER) RETURN VARCHAR2 IS*/
DECLARE
  p_money_amount NUMBER := -2.04;
  TYPE lt_array_type IS VARRAY(50) OF VARCHAR2(20);
   /*一维数组,字符串类型 */
  l_array        lt_array_type := lt_array_type('ONE ',
                                                'TWO ',
                                                'THREE ',
                                                'FOUR ',
                                                'FIVE ',
                                                'SIX ',
                                                'SEVEN ',
                                                'EIGHT ',
                                                'NINE ',
                                                'TEN ',
                                                'ELEVEN ',
                                                'TWELVE ',
                                                'THIRTEEN ',
                                                'FOURTEEN ',
                                                'FIFTEEN ',
                                                'SIXTEEN ',
                                                'SEVENTEEN ',
                                                'EIGHTEEN ',
                                                'NINETEEN ',
                                                'TWENTY ',
                                                'THIRTY ',
                                                'FORTY ',
                                                'FIFTY ',
                                                'SIXTY ',
                                                'SEVENTY ',
                                                'EIGHTY ',
                                                'NINETY ',
                                                'HUNDRED ',
                                                'THOUSAND ',
                                                'MILLION ',
                                                'BILLION ');
  c_money_amount VARCHAR2(14);
  l_string       VARCHAR2(600);
  n              CHAR;
  l_pre_n        CHAR;
  l_length       NUMBER;
  i              NUMBER;
  tmp            NUMBER;
  l_decimal_flag VARCHAR2(1);
  l_money_amount NUMBER;
  l_sign         VARCHAR2(10);
BEGIN
  l_money_amount := round(abs(p_money_amount), 2);
  IF p_money_amount < 0 THEN
    l_sign := 'NEGATIVE ';
  ELSE
    l_sign := '';
  END IF;
  tmp            := l_money_amount * 100;
  c_money_amount := rtrim(ltrim(to_char(tmp, '999999999999999999')));
  l_length       := length(c_money_amount);
  i              := 0;
  WHILE i < l_length – 2 LOOP
    i := i + 1;
    IF MOD(l_length – 2 – i, 3) = 2 THEN
      n := substr(c_money_amount, i, 1);
      IF n <> '0' THEN
        l_string := l_string || l_array(to_number(n));
        l_string := l_string || l_array(to_number(28));
      END IF;
    END IF;
    IF MOD(l_length – 2 – i, 3) = 1 THEN
      n := substr(c_money_amount, i, 1);
      IF n = '1' THEN
        l_pre_n := n;
      END IF;
      IF n NOT IN ('0', '1') THEN
        l_string := l_string || l_array(to_number(n) + 18);
      END IF;
    END IF;
    IF MOD(l_length – 2 – i, 3) = 0 THEN
      IF nvl(l_pre_n, 'X') = '1' THEN
        n        := substr(c_money_amount, i, 1);
        l_string := l_string || l_array(to_number(l_pre_n || n));
        l_pre_n  := NULL;
      ELSE
        n := substr(c_money_amount, i, 1);
        IF n <> '0' THEN
          l_string := l_string || l_array(to_number(n));
        END IF;
      END IF;
    END IF;
    IF l_length – i = 5 AND substr(c_money_amount, i – 2, 3) <> '000' THEN
      l_string := l_string || l_array(to_number(29));
    END IF;
    IF l_length – i = 8 AND substr(c_money_amount, i – 2, 3) <> '000' THEN
      l_string := l_string || l_array(to_number(30));
    END IF;
    IF l_length – i = 11 THEN
      l_string := l_string || l_array(to_number(31));
    END IF;
  END LOOP;
  n := substr(c_money_amount, l_length – 1, 1);
  IF n NOT IN ('0', '1') THEN
    l_decimal_flag := 'Y';
    l_string       := l_string || 'AND ';
    l_string       := l_string || l_array(to_number(n) + 18);
  END IF;
  IF n = '1' THEN
    l_decimal_flag := 'Y';
    l_string       := l_string || 'AND ';
    l_pre_n        := n;
    n              := substr(c_money_amount, l_length, 1);
    l_string       := l_string || l_array(to_number(l_pre_n || n));
  ELSE
    n := substr(c_money_amount, l_length, 1);
    IF n <> '0' THEN
      IF nvl(l_decimal_flag, 'N') = 'N' THEN
        l_string := l_string || 'AND ';
      END IF;
      l_decimal_flag := 'Y';
      l_string       := l_string || l_array(to_number(n));
    END IF;
  END IF;
  IF l_decimal_flag = 'Y' THEN
    l_string := l_string || 'CENTS ';
  ELSE
    l_string := l_string;
  END IF;
  l_string := l_sign || l_string; /*RETURN l_string;*/
  dbms_output.put_line(l_string); /* EXCEPTION  WHEN OTHERS THEN    RETURN(SQLERRM);*/
END;

–此段引用自:http://catonisland.cn/post/138.html 

如何查询Oracle EBS Weblogic访问地址及相关扩展知识

1. Oracle EBS Weblogic访问地址固定格式

http://xxxx:yyyy/console

xxxx为Oracle EBS域名地址

yyyy为Weblogic访问端口

/console为固定字符

2. 如何获取访问端口号

通过操作系统应用用户(比如appluat)执行如下命令:

grep wls_adminport $CONTEXT_FILE

如下图所示例子:

3. 访问最终地址

http://xxxx:7005/console

扩展,如何找Oracle EBS相关端口:

1. 通过操作系统应用用户执行命令,找到CONTEXT_FILE所在地址:

echo $CONTEXT_FILE

2. 直接cat /u01/uat/app/fs2/inst/apps/UAT_erp01/appl/admin/UAT_erp01.xml文件,或者通过ftp工具下载目标文件UAT_erp01,找出需要的端口名称(也可直接查看到端口)

3. 如果在平时知道端口名字,直接通过以下命令查询即可(如最上图所示):

grep web_port $CONTEXT_FILE    –ebs应用访问端口

grep wls_adminport $CONTEXT_FILE    –ebs weblogic访问端口

grep dbport $CONTEXT_FILE  –ebs 数据库端口

3. R12.2weblogic版本查询

/u01/test/app/fs1/FMW_Home
grep -i "Weblogic Server" registry.xml

4. R12.1ias版本查询

cd $IAS_ORACLE_HOME/Apache/Apache/bin

./httpd -version

Patch Set Update (PSU) Release Listing for Oracle WebLogic Server (WLS) (文档 ID 1470197.1)

Critical Patch Update (CPU) Program July 2019 Patch Availability Document (PAD) (文档 ID 2534806.1)

 

 

 

ORA-24247网络访问被访问控制列表 (ACL) 拒绝

        情景:Oracle EBS并发管理器无法启动

        现象:Oracle并发请求程序错误,表面日志指向内存错误

        环境:Oracle EBS R12.2.4

        2016年12月14号上午10点钟,Oracle EBS系统发现所有推向外围电商系统的并发程序全部保存,主要报错的信息是“内存不足”。由于处在业务发生期,因此不能随便停机重启(很多时候EBS重启能解决很大程度的问题)。于是准备等到中午午休时间通知所有业务财务人员停止使用,重启系统,同时开发人员和DBA(非EBS DBA)也在进行相关问题排查处理。技术人员提供相关日志到DBA处,然而始终未能在准备停机之前解决。

        第一次重启:中午12点整,我按照系统启停脚本正常启停应用服务,未发现报错,但是进系统发现所有并发未能启动。看到这里也并没有因此慌张,因为以前很多次启动应用服务的时候都遇到过,于是单独启动并发服务adcmctl.sh,也并未报错,结果还是没提示任何错误。再次进入前台页面查验,还是未能正常启动;

        第二次重启:中午12点36分,这次同时启动数据库和应用,完成相关操作后,发现系统并发管理器正常启动。这时去查验电商推送程序,发现还是报“内存”错误。此时已经12点45分左右。

        第三次重启:向DBA求助,他也没有更好的方法,于是他提出重启整个机器,reboot操作系统。由他操作,操作完成后结果并发管理器全部无法启动。这下有些慌了,因为已经到中午13点,这时业务人员已经打电话到领导那,甚至有相关人员直接来找领导问询进度。

        第四次、五次…….,各种进程kill后,多次重启仍然无法解决。就这样一直拖到下班。其中一个同事已经找好外部某著名13摸的技术专家,准备在实在没办法时通过外部资源付费解决(领导已经同意付费)。此时公司内部的DBA做过应用的回退,正准备进行数据库的闪回操作,闪回至中午11点50。而且也这样做了。终于在牺牲部分业务数据后,系统启动正常。马上去验证电商接口问题,很遗憾还是一片红彤彤。此时已经18点35分。

       此时大家都准备回家去,至少系统已经能使用,除开电商接口。15号早上起来,发现群里已经解决。其中一个技术顾问从最开始的并发请求的日志中发现ACL网络访问控制。问题迎刃而解。但原因未明,ACL安全性注册数据被冲掉(EBS访问外网系统均需注册ACL访问控制),具体的相关注册方式如下:

————————————————————————————————————————————

SecureCRT,以DBA登录数据库 uat3db:

Last login: Mon Jan 25 20:12:49 2016 from 172.16.1.225
[orauat3@uat3db ~]$ sqlplus apps/apps

SQL*Plus: Release 11.2.0.4.0 Production on Mon Jan 25 20:14:37 2016

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> conn /as sysdba
Connected.
SQL> exec  dbms_network_acl_admin.create_acl('httprequestmid.xml','http request mid', 'APPS', TRUE,'connect',NULL,  NULL);

PL/SQL procedure successfully completed.

SQL> exec DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE( acl => 'httprequestmid.xml', principal => 'APPS', is_grant => TRUE, privilege => 'resolve');

PL/SQL procedure successfully completed.

SQL> COMMIT;

Commit complete.

SQL> exec dbms_network_acl_admin.assign_acl('httprequestmid.xml','*',NULL, NULL); commit;

PL/SQL procedure successfully completed.

————————检查是否生效命令如下————————————————————————–

–查询:
SELECT any_path FROM resource_view WHERE any_path like '/sys/acls/%';

SELECT acl,
       principal,
       privilege,
       is_grant,
       TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,
       TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date
  FROM dba_network_acl_privileges;

SELECT host, lower_port, upper_port, acl FROM dba_network_acls;

 

————————————————————————————————————————————

————以下是其他可参考文件————-

参考文件:

http://www.linuxidc.com/Linux/2013-12/93385.htm

http://blog.sina.com.cn/s/blog_4ca24203010128oe.html

http://www.shangxueba.com/jingyan/1666117.html

http://www.cnblogs.com/benio/archive/2011/10/21/2219826.html

http://www.2cto.com/database/201312/261243.html

select utl_http.request('www.apple.com') from dual;

需要先使用 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL 创建访问控制列表(ACL)

BEGIN
 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
  acl          => 'email_server_permissions.xml',
  description  => 'Enables network permissions for the e-mail server',
  principal    => 'STAT',
  is_grant     => TRUE,
  privilege    => 'connect');
END;

–查询
SELECT host, lower_port, upper_port, acl FROM dba_network_acls;
SELECT acl,
       principal,
       privilege,
       is_grant,
       TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,
       TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date
  FROM dba_network_acl_privileges;

SELECT ANY_PATH FROM RESOURCE_VIEW;
结果如下图所示:

 

Oracle PLSQL Json类接口例子

说明:此段例子程序来源公司闫同事,需要json安装文件的,可留言索取。

例子程序:

–物料LIST结果解析
DECLARE
  l_item_info json;
  l_item_list json_list;
  l_item_line json;

  l_ret_code       VARCHAR2(100);
  l_ret_msg        VARCHAR2(100);
  l_json_list_data json_list;
  l_temp_line      json;
  l_erpcode        VARCHAR2(100);
  l_itemno         VARCHAR2(100);
  l_type           VARCHAR2(100);

BEGIN
  l_item_info := json();

  l_item_info.put('code',
                  '1');
  l_item_info.put('message',
                  '调用成功');

  l_item_list := json_list();

  –物料1
  l_item_line := json();
  l_item_line.put('erpCode',
                  '10000001');
  l_item_line.put('itemNo',
                  '22222222222');
  l_item_line.put('type',
                  '4');
  dbms_output.put_line(json_ext.get_string(l_item_line,
                                           'erpCode') || '是:');
  l_item_line.print;
  dbms_output.put_line('—————————–');
  l_item_list.append(l_item_line.to_json_value);

  –物料2
  l_item_line := json();
  l_item_line.put('erpCode',
                  '10000003');
  l_item_line.put('itemNo',
                  '333333333333');
  l_item_line.put('type',
                  '2');
  dbms_output.put_line(json_ext.get_string(l_item_line,
                                           'erpCode') || '是:');
  l_item_line.print;
  dbms_output.put_line('—————————–');
  l_item_list.append(l_item_line.to_json_value);

  –物料LIST构成
  dbms_output.put_line('l_item_list是:');
  l_item_list.print;
  dbms_output.put_line('—————————–');

  –返回结果整体构成
  l_item_info.put('data',
                  l_item_list.to_json_value);
  dbms_output.put_line('l_item_info是:');
  l_item_info.print;
  dbms_output.put_line('—————————–');

  –返回结果解析
  l_ret_code := json_ext.get_string(l_item_info,
                                    'code');
  l_ret_msg  := json_ext.get_string(l_item_info,
                                    'message');

  dbms_output.put_line('解析结果:');
  dbms_output.put_line('l_ret_code: ' || l_ret_code);
  dbms_output.put_line('l_ret_msg: ' || l_ret_msg);

  IF l_ret_code = '1' THEN
    l_json_list_data := json_list(l_item_info.get('data'));
 
    FOR i IN 1 .. l_json_list_data.count()
    LOOP
      l_temp_line := json(l_json_list_data.get(i));
   
      l_erpcode := json_ext.get_string(l_temp_line,
                                       'erpCode');
      l_itemno  := json_ext.get_string(l_temp_line,
                                       'itemNo');
      l_type    := json_ext.get_string(l_temp_line,
                                       'type');
   
      dbms_output.put_line('l_erpcode: ' || l_erpcode);
      dbms_output.put_line('l_itemNo: ' || l_itemno);
      dbms_output.put_line('l_type: ' || l_type);
   
    END LOOP;
 
  END IF;

END;

——————————————————————————

以下是输出结果:

10000001是:
{
  "erpCode" : "10000001",
  "itemNo" : "22222222222",
  "type" : "4"
}
—————————–
10000003是:
{
  "erpCode" : "10000003",
  "itemNo" : "333333333333",
  "type" : "2"
}
—————————–
l_item_list是:
[{
  "erpCode" : "10000001",
  "itemNo" : "22222222222",
  "type" : "4"
}, {
  "erpCode" : "10000003",
  "itemNo" : "333333333333",
  "type" : "2"
}]
—————————–
l_item_info是:
{
  "code" : "1",
  "message" : "\u8C03\u7528\u6210\u529F",
  "data" : [{
    "erpCode" : "10000001",
    "itemNo" : "22222222222",
    "type" : "4"
  }, {
    "erpCode" : "10000003",
    "itemNo" : "333333333333",
    "type" : "2"
  }]
}
—————————–
解析结果:
l_ret_code: 1
l_ret_msg: 调用成功
l_erpcode: 10000001
l_itemNo: 22222222222
l_type: 4
l_erpcode: 10000003
l_itemNo: 333333333333
l_type: 2

如何根据Web页面关于此页查到页面字段对应视图或基表

目标:查询标准客户地点层收件人存储的视图或基表

1. 进入相应页面,找到需要查询的字段,如下图

2. 点击全部展开,ctrl+f搜索“收件人”,,如下图所示

3. 获取“HzPuiPartySiteVO”信息及相应字段信息“Addresse”,如下图所示

4. 点击全部隐藏及业务组件,如下图所示

5. 在打开的业务组件,根据关键字“HzPuiPartySiteVO”搜索结果,如下图所示

6. 点击搜索出结果连接,即可找到相应所需sql命令,如下图所示

 

技术笔记(小潘的技术记录博客)