【问题标题】:Wrapping a Stored Procedure包装存储过程
【发布时间】:2014-10-09 08:00:22
【问题描述】:

我在 Oracle 中创建了一个存储过程(通过 TOAD)。 我需要将此过程交付给其他一些开发人员。所要做的就是包装程序,以便在基本级别他/她不应该能够查看代码。 同时,开发者应该能够创建过程并执行/测试它。

我的程序保存在说 FileName.sql 中,其内容如下:

创建或替换过程 是 宣言 开始 代码 结束;

现在我想包装这个 FileName.sql。以便加密文件可以发送给其他人在不同的环境中检查。

请帮助我如何包装,然后其他人将如何创建并执行相同的过程。

提前致谢。

【问题讨论】:

  • 我已经更新了我的答案 =)

标签: sql oracle plsql plsqldeveloper


【解决方案1】:

Oracle WRAP 实用程序正是这样做的 - 允许您以适合运输的形式对存储过程进行编码。
包装后的代码与源代码一样可移植,但不能作为纯文本进行检查。

您需要使用合适的系统用户访问命令行(即可以访问 Oracle 二进制命令的用户,例如 sqlplus 等),基本语法为:

wrap iname=input_file [ oname=output_file ]

如果不指定任何扩展名,则输入默认为.sql,输出默认为.plb
一旦你生成了一个.plb 文件,你就可以对数据库执行它来创建你的存储过程。

见:

警告

WRAPencoded 程序并不完全安全 - 可以“unwrap”它们。
使用WRAP 的更好方法是将要保护的过程放在一个包中,并将WRAP 放在包定义中。

假设您的程序是:

CREATE OR REPLACE PROCEDURE PR_OUTPUT_TEXT(
  P_TYPE      IN  CHAR,
  P_TEXT      IN  VARCHAR2
) IS
  V_TYPE          CHAR(3) := UPPER(P_TYPE);
BEGIN
  
  IF V_TYPE = 'LOG' THEN
    APPS.FND_FILE.PUT_LINE(APPS.FND_FILE.LOG, TO_CHAR(SYSDATE,'HH24:MI:SS')||' - '||P_TEXT);
  ELSE
    APPS.FND_FILE.PUT_LINE(APPS.FND_FILE.OUTPUT, P_TEXT);
  END IF;
  
END PR_OUTPUT_TEXT;

你通常会使用:

EXECUTE PR_OUTPUT_TEXT('LOG', 'Kittehz!!!')

在一个包中,你可以定义包体和过程:

CREATE OR REPLACE PACKAGE BODY USER.MYPACKAGE AS

  PROCEDURE PR_OUTPUT_TEXT(
    P_TYPE      IN  CHAR,
    P_TEXT      IN  VARCHAR2
  ) IS
  BEGIN
  
    IF V_TYPE = 'LOG' THEN
      APPS.FND_FILE.PUT_LINE(APPS.FND_FILE.LOG, TO_CHAR(SYSDATE,'HH24:MI:SS')||' - '||P_TEXT);
    ELSE
      APPS.FND_FILE.PUT_LINE(APPS.FND_FILE.OUTPUT, P_TEXT);
    END IF;
  
  END PR_OUTPUT_TEXT;

END MYPACKAGE;

你会调用这个包:

EXECUTE USER.MYPACKAGE.PR_OUTPUT_TEXT('LOG', 'ERMAHGERD KERTERNS!!!')

【讨论】:

  • 感谢您的回复,假设我把它放在一个包中,比如说创建或替换包 AS 过程(变量类型);结束 ;创建或替换包体 作为过程代码 End ;现在我该如何包装过程定义?
【解决方案2】:

从文档中,准确地说,这是您需要做的:

运行 wrap 实用程序

例如,假设wrap_test.sql 文件包含以下内容:

CREATE PROCEDURE wraptest IS
  TYPE emp_tab IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;
  all_emps      emp_tab;
BEGIN
  SELECT * BULK COLLECT INTO all_emps FROM employees;
  FOR i IN 1..10 LOOP
    DBMS_OUTPUT.PUT_LINE('Emp Id: ' || all_emps(i).employee_id);
  END LOOP;
END;
/

要打包文件,请在操作系统提示符下运行以下命令:

wrap iname=wrap_test.sql

wrap 实用程序的输出类似于以下内容:

PL/SQL Wrapper: Release 10.2.0.0.0 on Tue Apr 26 16:47:39 2005
Copyright (c) 1993, 2005, Oracle.  All rights reserved.
Processing wrap_test.sql to wrap_test.plb
If you view the contents of the wrap_test.plb text file, the first line is CREATE PROCEDURE wraptest wrapped and the rest of the file contents is hidden.

您可以在SQL*Plus中运行wrap_test.plb来执行文件中的SQL语句:

SQL> @wrap_test.plb

wrap_test.plb运行后,就可以执行创建的过程了:

SQL> CALL wraptest();

更多信息在docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多