2010-08-10 7 views
1

명령 프롬프트에서 plsql 컴파일 어떤 식 으로든 sqlplus 열고 명령 또는 @ filename을 작성하여 어떤 식 으로든?명령 프롬프트 (아니 sqlplus)에서 PLSQL 컴파일

우리는 출력을 파일로 가져오고 우리가

감사에서 작업하는 코드 검토 도구를 구문 분석 할 ...

+0

컴파일 된 pl/sql pogram (바이트 코드 또는 오라클이 소스 코드에서 만드는 모든 것)을 처리하고 싶다고 올바르게 이해합니까? –

+0

OP가 pl/sql을 포함하고있는 스크립트 (unix, windows?)를 실행하려고합니까? 유닉스의 경우 여기에있는 문서를 고려하십시오. –

답변

1

그나마 그렇게 생각 몇 가지 컴파일러 내부에 대한 피트 피니에 의해 this presentation 참조 . 사용할 수있는 ANTLR 문법 file을 나열합니다.

PL/SQL에 대한 구문 분석기 구현에 대해 약 Scalacombinator에 대해서도 언급했습니다.

2

잘 모르겠다. 무슨 뜻인지 잘 모르겠다. 실행 결과를 캡처하는 것처럼 들리 겠지만 실제로 SQL * Plus를 완전히 피하고 싶은지는 알 수 없다. 나의 첫번째 독서에서 이것은 다음과 같이 간단하다 :

sqlplus -s user/password @filename > outputfile 

... 그러나 그것은 내가 중요한 무엇인가 놓쳤다라고 생각하게한다.

0

원본 - USER_SOURCE 만 출력하면됩니다.

동적 생성을 많이하고 코드를 추출하고 추가하고 패키지를 다시 컴파일하는 코드를 작성했습니다.

가장 간단한 방법은 CREATE PACKAGE 명령을 동적 SQL로 마무리하는 것입니다.

EXECUTE IMMEDIATE 
    'CREATE OR REPLACE PACKAGE myPackageName AS '||pPackageSource; 

그러나 소스가 하나의 문자열임을 의미합니다. VARCHAR2 라인 (dbms_sql.varchar2s)의 배열을 수용 할 수있는 구형 DBMS_SQL.PARSE 메소드를 사용합니다.

예 - user_source에서 소스를 varchar 2s로 가져온 다음 dbms_sql을 통해 동일한 패키지를 다시 컴파일하는 코드입니다. 는 PL/SQL 코드/데이터베이스가 도달 할 수있는 일 -

DECLARE 
    lCid INTEGER; 
    lError INTEGER; 
    lSource dbms_sql.varchar2s; 

    FUNCTION fSource(
     pName IN VARCHAR2, 
     pType IN VARCHAR2) 
    RETURN dbms_sql.varchar2s 
    IS 
     CURSOR cSource IS 
     SELECT RTRIM(text,CHR(10)) 
     FROM user_source 
     WHERE name = pName 
     AND  type = pType 
     ORDER BY line; 
     lSource pp_type.gtyp_ArrayOfSource; 
    BEGIN 
     OPEN cSource; 
     FETCH cSourcee BULK COLLECT INTO lSource; 
     CLOSE cSource; 
     RETURN lSource; 
    END fSource; 
BEGIN 
    lSource := fSource(pName => 'myPackageName',pType => 'PACKAGE'); 
    /* Add CREATE or REPLACE to the start of the source */ 
    lSource(1) := 'CREATE OR REPLACE '||lSource(1); 
-- Cannot use EXECUTE IMMEDIATE as this is an ARRAY 
    lCid := dbms_sql.OPEN_CURSOR; 
    -- 
    dbms_sql.parse(
     c => lCid , 
     statement => lSource, 
     lb => 1, 
     ub => p_source.count, 
     lfflg => true, 
     language_flag => dbms_sql.v7 
    ); 
    dbms_sql.close_cursor (lCid); 
END; 

쉽게 파일, HTTP 서비스 등의 소스를 추출하기 위해 변경 될 수 있습니다.

실제 코드는 확인을 포함하는 결과가 유효한지 확인 이메일가

코드가 실행되어야 USER_SOURCE의 라인에 대해 일치 (USER_ERRORS)에서 오류 등

보안 패키지를 설치할 수있는 권한 - 이는 실행중인 사용자보다 높은 권한을 가진 사용자에 대해 패키지를 설치하는 것을 의미 할 수 있습니다.

이 작업을 수행하는 경우 '정상적인'DB 사용자에게 노출되는 인터페이스에 대해 신중해야합니다. 즉, 일반 사용자가 패키지 소스 또는 권한을 추출하거나 수정할 수 있도록하는 것을 원하지 않습니다.

내 접근 방식은 모든 서비스 기능 (소스, 설치, 동적 실행 등)에 대한 하위 수준의 패키지 (보통 사용자는 볼 수 없음)를 만든 다음 제한된 특정 동작 집합을 귀하의 경우에는 'reviewCode'절차를 공개하는 것과 같을 것입니다.

관련 문제