zoukankan      html  css  js  c++  java
  • DBMS_NETWORK_ACL_ADMIN

    DBMS_NETWORK_ACL_ADMIN学习
    转载
    http://blog.sina.com.cn/s/blog_4f925fc30102e2se.html
    标签: oracle it 分类: 数据库

    http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_networkacl_adm.htm

    这个链接的左边菜单树里有关于Oracle的好多高级函数库可学习。


    oracle邮件发送存储过程示例

    CREATE OR REPLACE PROCEDURE proc_send_mail(
    p_recipient VARCHAR2, -- 邮件接收人,多个接收人用逗号分隔“," 例如 abc@xx.com,bcd@xx.com
    p_subject VARCHAR2, -- 邮件标题
    p_message VARCHAR2 -- 邮件正文
    )
    IS

    --下面四个变量请根据实际邮件服务器进行赋值
    v_mailhost  VARCHAR2(30) := '';     --SMTP服务器地址
    v_user      VARCHAR2(30) := ''; --登录SMTP服务器的用户名
    v_pass      VARCHAR2(20) := '';          --登录SMTP服务器的密码
    v_sender    VARCHAR2(50)  := ''; --发送都邮箱,一般与 ps_user 对应
    
    v_conn  UTL_SMTP.connection; --到邮件服务器的连接
    v_msg varchar2(30000);  --邮件内容
    

    BEGIN

    v_conn := UTL_SMTP.open_connection(v_mailhost, 25);
    UTL_SMTP.ehlo(v_conn, v_mailhost); --是用 ehlo() 而不是 helo() 函数
    --否则会报:ORA-29279: SMTP 永久性错误: 503 5.5.2 Send hello first.
    
    UTL_SMTP.command(v_conn, 'AUTH LOGIN');   -- smtp服务器登录校验
    UTL_SMTP.command(v_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_user))));
    UTL_SMTP.command(v_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_pass))));
    
    UTL_SMTP.mail(v_conn, '<'||v_sender||'>');     --设置发件人
    
    for c in (select COLUMN_VALUE from table(split_str(p_recipient,',')) ) loop
    UTL_SMTP.rcpt(v_conn, '<'||c.COLUMN_VALUE||'>');  --设置收件人
    end loop ;
    
    -- 创建要发送的邮件内容 注意报头信息和邮件正文之间要空一行
    v_msg :='Date:'|| TO_CHAR(SYSDATE, 'dd mon yy hh24:mi:ss')
        || UTL_TCP.CRLF || 'From: '|| 'auto sender' || '<' || v_sender || '>'
        || UTL_TCP.CRLF || 'To: '  || p_recipient || '<' || p_recipient || '>'
        || UTL_TCP.CRLF || 'Subject: P7 ' || p_subject
        || UTL_TCP.CRLF || UTL_TCP.CRLF  -- 这前面是报头信息
        || p_message;    -- 这个是邮件正文
    
    --UTL_SMTP.DATA(v_conn, v_msg);
    UTL_SMTP.open_data(v_conn); --打开流
    
    --转换字符集 gaiwei modify 解决中文乱码
    UTL_SMTP.WRITE_DATA(v_conn, 'Content-Type: text/plain;charset=utf-8' ||chr(13) || chr(10));
    
    UTL_SMTP.write_raw_data(v_conn, UTL_RAW.cast_to_raw(v_msg)); --这样写标题和内容都能用中文
    UTL_SMTP.close_data(v_conn); --关闭流
    UTL_SMTP.quit(v_conn); --关闭连接
    

    EXCEPTION

    WHEN OTHERS THEN
        DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
        DBMS_OUTPUT.put_line(DBMS_UTILITY.format_call_stack);
    

    END;


    oracle存储过程通过http接收xml文件并解析入库

    --------------------------------------------配置--------------------------------------------------

    --创建控制列表并赋权
    BEGIN
    DBMS_NETWORK_ACL_ADMIN.create_acl (
    acl => 'test_acl_file.xml',
    description => 'this is a test',
    principal => 'SCOTT',
    is_grant => TRUE,
    privilege => 'connect',
    start_date => SYSTIMESTAMP,
    end_date => NULL);
    COMMIT;
    END;

    --添加新用户
    EGIN
    DBMS_NETWORK_ACL_ADMIN.add_privilege (
    acl => 'test_acl_file.xml',
    principal => 'user_name',
    is_grant => FALSE,
    privilege => 'connect',
    position => NULL,
    start_date => NULL,
    end_date => NULL);

    COMMIT;
    END;

    --使用DROP_ACL删除访问控制列表

    BEGIN
    DBMS_NETWORK_ACL_ADMIN.drop_acl (
    acl => 'test_acl_file.xml');
    COMMIT;
    END;

    --给网络分配一个访问控制列表
    BEGIN
    DBMS_NETWORK_ACL_ADMIN.assign_acl (
    acl => 'test_acl_file.xml',
    host => 'www.test.com',--特定ip
    lower_port => 80,--指定端口
    upper_port => NULL);

    COMMIT;
    END;

    --访问控制列表视图
    select * from DBA_NETWORK_ACLS;
    select * from DBA_NETWORK_ACL_PRIVILEGES;
    select * from USER_NETWORK_ACL_PRIVILEGES;

    SELECT *
    FROM TABLE(DBMS_NETWORK_ACL_UTILITY.domains('www.chinastock.com.cn'));

    --测试
    DECLARE
    l_url VARCHAR2(300) := 'http://www.test.com.cn/stock.xml';
    l_http_request UTL_HTTP.req;
    l_http_response UTL_HTTP.resp;
    BEGIN
    -- Make a HTTP request and get the response.
    l_http_request := UTL_HTTP.begin_request(l_url);
    l_http_response := UTL_HTTP.get_response(l_http_request);
    UTL_HTTP.end_response(l_http_response);

    END;

    -----------------------------------------代码----------------------------------------------------

    create or replace procedure proc_recive_xml (p_url in varchar2)

    is
    l_http_request utl_http.req;
    l_http_response utl_http.resp;
    l_clob clob;
    l_text varchar2(32767);
    l_parser dbms_xmlparser.parser;
    l_doc dbms_xmldom.domdocument;
    l_nl dbms_xmldom.domnodelist;
    l_n dbms_xmldom.domnode;
    parent_rootnode dbms_xmldom.domnode;
    l_rootnode_name varchar2(200);
    l_name varchar2(1000);
    l_code varchar2(6);

    type v_index_stock is record (
    index_name varchar2(50),--板块名称
    stock_code varchar2(6)--股票代码
    );
    type v_arr_index_stock is table of v_index_stock index by binary_integer;
    arr_index_stock v_arr_index_stock;
    begin

    dbms_lob.createtemporary(l_clob, false);-- 初始化clob
    -- 发送http请求
    l_http_request := utl_http.begin_request(p_url);
    utl_http.set_header(l_http_request, 'content-type', 'text/html; charset=utf8');
    l_http_response := utl_http.get_response(l_http_request);
    -- 存储接收的http数据到clob
    begin
    loop
    utl_http.read_text(l_http_response, l_text, 32767);
    dbms_lob.writeappend (l_clob, length(l_text), l_text);
    end loop;
    exception
    when utl_http.end_of_body then
    utl_http.end_response(l_http_response);
    end;

    l_parser := dbms_xmlparser.newparser;-- 创建解析器
    -- 解析并创建dom文档
    dbms_xmlparser.parseclob(l_parser, l_clob);
    l_doc := dbms_xmlparser.getdocument(l_parser);

    --取节点item下各元素的值,先将items节点全部存放在 l_nl中
    l_nl := dbms_xmldom.getElementsByTagName_r(l_doc,'stock');
    for cur_emp in 0 .. dbms_xmldom.getlength(l_nl) - 1 loop
    l_n := dbms_xmldom.item(l_nl, cur_emp);
    -- 得到节点stock下元素的值
    l_code := xmldom.getattribute(xmldom.makeelement(l_n),'code');
    -- 得到节点stock的父节点bk
    parent_rootnode := dbms_xmldom.getparentnode(l_n);
    l_rootnode_name := xmldom.getnodename(parent_rootnode);
    -- 得到节点bk的属性name的值
    l_name := xmldom.getattribute(xmldom.makeelement(parent_rootnode),'name');
    arr_index_stock(arr_index_stock.count + 1).index_name := l_name;
    arr_index_stock(arr_index_stock.count).stock_code := l_code;
    end loop;

    -- 释放分析函数的资源
    dbms_xmlparser.freeparser(l_parser);
    -- 将doc清空,释放资源
    dbms_xmldom.freedocument(l_doc);
    --清空数据
    delete from tb_index_0292;
    for idx in 1..arr_index_stock.count loop
    --dbms_output.put_line('name =' ||arr_stock_concept(idx).index_name || ' ,code = '||arr_stock_concept(idx).stock_code);
    insert into tb_index_0292
    values(idx,arr_index_stock(idx).index_name,arr_index_stock(idx).stock_code,ob_seq_id.nextval);
    end loop;
    commit;

    --释放临时clob
    dbms_lob.freetemporary(l_clob);
    exception
    when others then
    rollback;
    utl_http.end_response(l_http_response);
    dbms_lob.freetemporary(l_clob);
    end;

    --------------------------------------文件格式---------------------------------------------------

  • 相关阅读:
    操作符详解(思维导图)
    数组(C语言、思维导图)
    函数(C语言、思维导图)
    分支语句与循环语句(知识点思维导图)
    单链表及其基本操作
    顺序表
    时间复杂度与空间复杂度
    javascript基础知识show
    Java中的四舍五入
    JavaScript中数组迭代方法(jquery)
  • 原文地址:https://www.cnblogs.com/oracle-ziyuhou/p/6086218.html
Copyright © 2011-2022 走看看