Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段
摘要:最近项目中用到了存储过程,触发器,Function,由于以前没怎么用过,所以查资料,请教同事,最后总算是把问题解决了,问题是这样的,数据库中有三张表一张是存放从远程服务器获取数据的MBINMSGS表,这个表里面有个Clob字段,里面存放的是xml式的字符串
摘要:最近项目中用到了存储过程,触发器,Function,由于以前没怎么用过,所以查资料,请教同事,最后总算是把问题解决了,问题是这样的,数据库中有三张表一张是存放从远程服务器获取数据的MBINMSGS表,这个表里面有个Clob字段,里面存放的是xml格式的字符串,我们要把这个表里面的xml字符串通过Oracle解析出来,然后再把解析出来的数据插入对应的数据表:TB_CMS_FLGTINFO_A表和TB_CMS_FLGTINFO_D表,以上就是问题的描述,下面我把我的代码贴出了,以供大家参考:
一:数据表结构SQL
CREATE TABLE MIP.MBINMSGS ( ID NUMBER(30) NOT NULL, MBINMSGS_CLOB_MSG CLOB, MBINMSGS_DATE_RECEIVED DATE, MBINMSGS_DATE_PROCESSED DATE, MBINMSGS_SUBSYSTEM_NAME VARCHAR2(100 BYTE), MBINMSGS_SUBSYSTEM_DATE_SENT DATE, SERVICENAME VARCHAR2(30 BYTE) NOT NULL )
CREATE TABLE MIP.TB_CMS_FLGTINFO_A ( ID NUMBER(10) NOT NULL, ABNS VARCHAR2(64 BYTE), ACFT VARCHAR2(64 BYTE), AIRLINE VARCHAR2(64 BYTE), ALAP VARCHAR2(64 BYTE), BETM VARCHAR2(64 BYTE), CHDT VARCHAR2(64 BYTE), EIBT VARCHAR2(64 BYTE), FATA VARCHAR2(64 BYTE), FETA VARCHAR2(64 BYTE), FFID VARCHAR2(64 BYTE), FSTA VARCHAR2(64 BYTE), LMDT VARCHAR2(64 BYTE), LMUR VARCHAR2(64 BYTE), PSTM VARCHAR2(64 BYTE), RENO VARCHAR2(64 BYTE), RWAY VARCHAR2(64 BYTE), SPOT VARCHAR2(64 BYTE), STND VARCHAR2(64 BYTE) )
CREATE TABLE MIP.TB_CMS_FLGTINFO_D ( ID NUMBER(10) NOT NULL, A_TOBT VARCHAR2(64 BYTE), A_WEATHER VARCHAR2(64 BYTE), ABNS VARCHAR2(64 BYTE), ACFT VARCHAR2(64 BYTE), AIRLINE VARCHAR2(64 BYTE), ASAT VARCHAR2(64 BYTE), BCTM VARCHAR2(64 BYTE), BOTM VARCHAR2(64 BYTE), BSTM VARCHAR2(64 BYTE), C_TOBT VARCHAR2(64 BYTE), COBT VARCHAR2(64 BYTE), CTOT VARCHAR2(64 BYTE), DINT VARCHAR2(64 BYTE), DLAB VARCHAR2(64 BYTE), DNAP VARCHAR2(64 BYTE), DOUT VARCHAR2(64 BYTE), EDDI VARCHAR2(64 BYTE), EOBT VARCHAR2(64 BYTE), EPGT VARCHAR2(64 BYTE), EPOT VARCHAR2(64 BYTE), FATD VARCHAR2(64 BYTE), FFID VARCHAR2(64 BYTE), FSTD VARCHAR2(64 BYTE), LMDT VARCHAR2(64 BYTE), LMUR VARCHAR2(64 BYTE), OFTM VARCHAR2(64 BYTE), RENO VARCHAR2(64 BYTE), RWAY VARCHAR2(64 BYTE), STDI VARCHAR2(64 BYTE), STND VARCHAR2(64 BYTE), TSAT VARCHAR2(64 BYTE) )
二:Function.SQL
CREATE OR REPLACE FUNCTION MIP.GetXmlNodeValue (xmlStr CLOB, nodeName VARCHAR2) RETURN VARCHAR2 IS --创建xml解析器实例xmlparser.Parser xmlPar xmlparser.Parser := xmlparser.newParser; --定义DOM文档 xDoc xmldom.DOMDocument; --定义item子节点数目变量 lenItme INTEGER; --定义节点列表,存放item节点们 itemNodes xmldom.DOMNodeList; --定义节点,存放单个item节点 itemNode xmldom.DOMNode; ValueReturn VARCHAR2 (100); BEGIN --解析xmlStr中xml字符串,并存放到xmlPar中 xmlparser.parseClob (xmlPar, xmlStr); --将xmlPar中的数据转存到dom文档中 xDoc := xmlparser.getDocument (xmlPar); xmlparser.freeParser (xmlPar); --释放解析器实例 --获取所有item节点 itemNodes := xmldom.getElementsByTagName (xDoc, nodeName); --获取item节点的个数 lenItme := xmldom.getLength (itemNodes); IF lenItme = 0 THEN RETURN ''; END IF; --获取节点列表中的第1个item节点 itemNode := xmldom.item (itemNodes, 0); --获取所有子节点的值 ValueReturn := xmldom.getNodeValue (xmldom.getFirstChild (itemNode)); RETURN ValueReturn; END GetXmlNodeValue; /
三:存储过程.SQL
CREATE OR REPLACE PROCEDURE MIP.MIP_PARSE (xmlStr IN CLOB) IS RENO VARCHAR2 (100); AIRLINE VARCHAR2 (100); FFID VARCHAR2 (100); FFID_A VARCHAR2 (100); FFID_D VARCHAR2 (100); ABNS VARCHAR2 (100); ACFT VARCHAR2 (100); CHDT VARCHAR2 (100); EIBT VARCHAR2 (100); FATA VARCHAR2 (100); FETA VARCHAR2 (100); --FFID VARCHAR2 (100); FSTA VARCHAR2 (100); LMDT VARCHAR2 (100); LMUR VARCHAR2 (100); PSTM VARCHAR2 (100); RWAY VARCHAR2 (100); SPOT VARCHAR2 (100); STND VARCHAR2 (100); A_TOBT VARCHAR2 (100); A_WEATHER VARCHAR2 (100); --ABNS VARCHAR2 (100); --ACFT VARCHAR2 (100); ASAT VARCHAR2 (100); BCTM VARCHAR2 (100); BOTM VARCHAR2 (100); BSTM VARCHAR2 (100); C_TOBT VARCHAR2 (100); COBT VARCHAR2 (100); CTOT VARCHAR2 (100); DINT VARCHAR2 (100); DLAB VARCHAR2 (100); DOUT VARCHAR2 (100); EDDI VARCHAR2 (100); EOBT VARCHAR2 (100); EPGT VARCHAR2 (100); EPOT VARCHAR2 (100); FATD VARCHAR2 (100); --FFID VARCHAR2 (100); FSTD VARCHAR2 (100); --LMDT VARCHAR2 (100); --LMUR VARCHAR2 (100); OFTM VARCHAR2 (100); --RENO VARCHAR2 (100); --RWAY VARCHAR2 (100); STDI VARCHAR2 (100); --STND VARCHAR2 (100); TSAT VARCHAR2 (100); BEGIN RENO := GetXmlNodeValue (xmlStr, 'RENO'); AIRLINE := GetXmlNodeValue (xmlStr, 'AIRLINE'); FFID := GetXmlNodeValue (xmlStr, 'FFID'); ABNS := GetXmlNodeValue (xmlStr, 'ABNS'); ACFT := GetXmlNodeValue (xmlStr, 'ACFT'); CHDT := GetXmlNodeValue (xmlStr, 'CHDT'); EIBT := GetXmlNodeValue (xmlStr, 'EIBT'); FATA := GetXmlNodeValue (xmlStr, 'FATA'); FETA := GetXmlNodeValue (xmlStr, 'FETA'); FFID := GetXmlNodeValue (xmlStr, 'FFID'); FSTA := GetXmlNodeValue (xmlStr, 'FSTA'); LMDT := GetXmlNodeValue (xmlStr, 'LMDT'); LMUR := GetXmlNodeValue (xmlStr, 'LMUR'); PSTM := GetXmlNodeValue (xmlStr, 'PSTM'); RWAY := GetXmlNodeValue (xmlStr, 'RWAY'); SPOT := GetXmlNodeValue (xmlStr, 'SPOT'); STND := GetXmlNodeValue (xmlStr, 'STND'); A_TOBT := GetXmlNodeValue (xmlStr, 'A_TOBT'); A_WEATHER := GetXmlNodeValue (xmlStr, 'A_WEATHER'); --ABNS := GetXmlNodeValue (xmlStr, 'ABNS'); --ACFT := GetXmlNodeValue (xmlStr, 'ACFT'); ASAT := GetXmlNodeValue (xmlStr, 'ASAT'); BCTM := GetXmlNodeValue (xmlStr, 'BCTM'); BOTM := GetXmlNodeValue (xmlStr, 'BOTM'); BSTM := GetXmlNodeValue (xmlStr, 'BSTM'); C_TOBT := GetXmlNodeValue (xmlStr, 'C_TOBT'); COBT := GetXmlNodeValue (xmlStr, 'COBT'); CTOT := GetXmlNodeValue (xmlStr, 'CTOT'); DINT := GetXmlNodeValue (xmlStr, 'DINT'); DLAB := GetXmlNodeValue (xmlStr, 'DLAB'); DOUT := GetXmlNodeValue (xmlStr, 'DOUT'); EDDI := GetXmlNodeValue (xmlStr, 'EDDI'); EOBT := GetXmlNodeValue (xmlStr, 'EOBT'); EPGT := GetXmlNodeValue (xmlStr, 'EPGT'); EPOT := GetXmlNodeValue (xmlStr, 'EPOT'); FATD := GetXmlNodeValue (xmlStr, 'FATD'); FSTD := GetXmlNodeValue (xmlStr, 'FSTD'); --LMDT := GetXmlNodeValue (xmlStr, 'LMDT'); --LMUR := GetXmlNodeValue (xmlStr, 'LMUR'); OFTM := GetXmlNodeValue (xmlStr, 'OFTM'); STDI := GetXmlNodeValue (xmlStr, 'STDI'); TSAT := GetXmlNodeValue (xmlStr, 'TSAT'); IF INSTR(FFID,'-D-') > 0 THEN FFID_D := FFID; INSERT INTO TB_CMS_FLGTINFO_D (ID,A_TOBT,A_WEATHER,ABNS,ACFT,AIRLINE,ASAT,BCTM,BOTM,BSTM,C_TOBT,COBT,CTOT,DINT,DLAB,DOUT,EDDI,EOBT,EPGT,EPOT,FATD,FFID,FSTD,LMDT,LMUR,OFTM,RENO,RWAY,STDI,STND,TSAT) VALUES (FLGTINFO_D_SEQ.NEXTVAL, A_TOBT, A_WEATHER, ABNS, ACFT, AIRLINE, ASAT, BCTM, BOTM, BSTM, C_TOBT, COBT, CTOT, DINT, DLAB, DOUT, EDDI, EOBT, EPGT, EPOT, FATD, FFID_D, FSTD, LMDT, LMUR, OFTM, RENO, RWAY, STDI, STND, TSAT); ELSE FFID_A := FFID; INSERT INTO TB_CMS_FLGTINFO_A (ID,ABNS,ACFT,AIRLINE,CHDT,FFID,RENO,EIBT,FATA,FETA,FSTA,LMDT,LMUR,PSTM,RWAY,SPOT,STND) VALUES (FLGTINFO_A_SEQ.NEXTVAL, ABNS, ACFT, AIRLINE, CHDT, FFID_A, RENO, EIBT, FATA, FETA, FSTA, LMDT, LMUR, PSTM, RWAY, SPOT, STND); END IF; COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE (SQLERRM); END MIP_PARSE; /
四:触发器.SQL
DROP TRIGGER MIP.COPY_MIPDATA_TRIGGER; CREATE OR REPLACE TRIGGER MIP.COPY_MIPDATA_TRIGGER AFTER INSERT ON MIP.MBINMSGS FOR EACH ROW DECLARE -- LOCAL VARIABLES HERE BEGIN MIP_PARSE (:NEW.MBINMSGS_CLOB_MSG); END COPY_MIPDATA_TRIGGER; /
五:最后把所有的Function,存储过程,触发器都编译一下,就可以执行了,执行过程是:给表MBINMSGS中每插入一条数据,触发器就触发存储过程,存储过程再调用Function,最后把解析出来的xml字符串插入到对应的数据表中。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Oracle 테이블 스페이스 크기를 쿼리하려면 다음 단계를 따르십시오. 쿼리를 실행하여 테이블 스페이스 이름을 결정하십시오. 쿼리를 실행하여 테이블 스페이스 크기를 쿼리하십시오. sum (bytes)을 total_size, sum (bytes_free)으로 sum (bytes_free), sum (bytes) - sum (bytes_free)으로 dba_data_fices where tablespace_.

데이터 가져 오기 방법 : 1. SQLLOADER 유틸리티 사용 : 데이터 파일 준비, 제어 파일 작성 및 SQLLOADER 실행; 2. IMP/EXP 도구를 사용하십시오 : 데이터 내보내기, 데이터 가져 오기. 팁 : 1. 빅 데이터 세트에 권장되는 SQL*로더; 2. 대상 테이블이 존재해야하고 열 정의가 일치해야합니다. 3. 가져 오기 후에는 데이터 무결성을 확인해야합니다.

Oracle 설치 실패에 대한 방법 제거 : Oracle Service를 닫고 Oracle Program 파일 및 레지스트리 키 삭제, Oracle 환경 변수를 제거하고 컴퓨터를 다시 시작하십시오. 제거되지 않으면 Oracle 범용 제거 도구를 사용하여 수동으로 제거 할 수 있습니다.

Oracle 테이블 작성에는 다음 단계가 필요합니다. 테이블 작성 구문을 사용하여 테이블 이름, 열 이름, 데이터 유형, 제약 조건 및 기본값을 지정하십시오. 테이블 이름은 간결하고 설명 적이어야하며 30자를 초과해서는 안됩니다. 열 이름은 설명 적이어야하며 데이터 유형은 열에 저장된 데이터 유형을 지정합니다. NOT NULL 제약 조건은 열에서 NULL 값이 허용되지 않도록하고 기본 조항은 열의 기본값을 지정합니다. 테이블의 고유 한 레코드를 식별하기위한 주요 주요 제약. 외국 키 제약 조건은 테이블의 열이 다른 테이블의 기본 키를 지칭하도록 지정합니다. 기본 키, 고유 한 제약 조건 및 기본값이 포함 된 샘플 테이블 학생의 생성을 참조하십시오.

Oracle에서 인스턴스 이름을 보는 세 가지 방법이 있습니다. 명령 줄에 명령. "show instance_name"을 사용하십시오. sql*plus의 명령. 운영 체제의 작업 관리자, Oracle Enterprise Manager 또는 운영 체제를 통해 환경 변수 (Linux의 Oracle_Sid)를 확인하십시오.

Oracle은 여러 가지 중복 제거 쿼리 방법을 제공합니다. 별개의 키워드는 각 열에 고유 한 값을 반환합니다. 그룹 별 조항은 결과를 그룹화하고 각 그룹에 대해 비 반복 값을 반환합니다. 고유 한 키워드는 고유 한 행만 포함 된 인덱스를 만드는 데 사용되며 인덱스 쿼리는 자동으로 망상됩니다. row_number () 함수는 고유 한 숫자를 할당하고 1 행 만 포함하는 결과를 필터링합니다. 최소 () 또는 max () 함수는 숫자 열의 비 반복 값을 반환합니다. 교차 연산자는 두 결과 세트의 공통 값을 반환합니다 (중복 없음).

Oracle View 암호화를 사용하면보기에서 데이터를 암호화 할 수 있으므로 민감한 정보의 보안을 향상시킬 수 있습니다. 단계에는 다음이 포함됩니다. 1) 마스터 암호화 키 생성 (MEK); 2) 암호화 된 뷰 생성, 암호화 할보기 및 MEK를 지정하는 것; 3) 사용자가 암호화 된보기에 액세스하도록 승인합니다. 암호화 된 뷰 작동 방식 : 사용자가 암호화 된보기를 쿼리 할 때 Oracle은 MEK를 사용하여 데이터를 해독하여 공인 사용자 만 읽기 쉬운 데이터에 액세스 할 수 있도록합니다.

Alter Table 문을 사용하십시오. 특정 구문은 다음과 같습니다. Alter Table_Name Add Column_name Data_Type [제한 조건 -Clause]. 여기서 : table_name은 테이블 이름, column_name은 필드 이름, data_type는 데이터 유형이며, 제한 조건은 선택적 제한 조건입니다. 예 : Alter Table 직원 이메일 추가 Varchar2 (100) 직원 테이블에 이메일 필드를 추가합니다.
