2010-08-10 71 views
1

有没有办法通过命令提示符编译plsql而不是打开sqlplus并编写命令或@filename?从命令提示符编译PLSQL(不在sqlplus里面)

我们要输出导入到一个文件,分析它,因为我们是在

由于工作代码审查工具...

+0

我是否理解你是否想要处理编译的pl/sql程序(字节码或Oracle从源代码中生成的任何内容)? – 2010-08-10 09:57:03

+0

OP是否想运行嵌入了pl/sql的脚本(unix,windows?)?对于unix考虑这里的文件。 – 2010-08-10 10:03:17

回答

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重新编译相同的程序包的代码。

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服务等源 - 任何的PL/SQL代码/数据库可以达到。

实际代码包括验证,检查结果是有效的,电子邮件

代码需要被运行针对在USER_SOURCE线匹配的任何错误(来自USER_ERRORS)等

安全安装软件包的权限 - 这可能意味着针对具有比正在执行的用户更高的权限的用户安装软件包。

如果你这样做,你需要非常小心接触'普通'数据库用户的接口 - 即你不想创建任何让普通用户提取或修改包源或特权的东西。

我的方法是为所有服务功能(获取源代码,安装,动态执行等)创建低级包(隐藏于普通用户),然后是更高级别的包,这些包暴露了一组有限的特定操作普通用户 - 在你的情况下,这将像暴露'reviewCode'程序。

相关问题