Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 包装存储过程_Sql_Oracle_Plsql_Plsqldeveloper - Fatal编程技术网

Sql 包装存储过程

Sql 包装存储过程,sql,oracle,plsql,plsqldeveloper,Sql,Oracle,Plsql,Plsqldeveloper,我已经在Oracle中创建了一个存储过程(通过TOAD)。 我需要将这个过程交付给其他一些开发人员。所有需要做的就是包装过程,以便在基本级别上他/她不能查看代码。 同时,开发人员应该能够创建过程并执行/测试它 我的过程保存在文件名.sql中,其内容如下: 创建或替换过程 是 宣言 开始 代码 结束 现在我想包装这个FileName.sql。这样加密后的文件可以在不同的环境下发送给其他人进行检查 请帮助我如何包装,然后其他人将如何创建过程,并执行相同的 提前感谢。OracleWRAP实用程序正是这

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

我的过程保存在文件名.sql中,其内容如下:

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

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

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


提前感谢。

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

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

wrap iname=input_file [ oname=output_file ]
如果未指定任何扩展名,则输入的默认值为
.sql
,输出的默认值为
.plb

生成
.plb
文件后,可以对数据库执行该文件以创建存储过程

见:

警告
WRAP
编码过程不是完全安全的-可以将其“打包”。
使用
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!!!')

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

运行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;
/
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.
要包装文件,请在操作系统提示符下运行以下命令:

wrap iname=wrap_test.sql
wrap实用程序的输出类似于以下内容:

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;
/
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\u test.plb
,以执行文件中的SQL语句:

SQL> @wrap_test.plb
运行
wrap_test.plb
后,您可以执行创建的过程:

SQL> CALL wraptest();

更多信息请参见

感谢您的回复,假设我将其放入了一个包中,比如创建或替换包作为过程(变量类型);结束;创建或替换包体作为程序代码结束;现在如何包装过程定义?我已经更新了答案=)