APEX调用外部存储函数或存储过程

env*_*voy 2 oracle plsql oracle-apex

关于如何从APEX调用存储过程而不仅仅是使用简单的DB-Link,是否有"最佳实践"?

Ric*_*ual 5

在Oracle APEX中调用PL/SQL存储过程

通过将PL/SQL存储过程与基于Application Express Web的框架工作相结合,开发强大,可维护和高效的解决方案涉及大量细节.不知道OP作者的当前技能水平,我认为最有用的解释是从头开发的一个简单示例.

入门: APEX环境有很多工具可以帮助您入门.如果您还没有安装了APEX的Oracle数据库环境,请考虑通过Oracle.com上的APEX主页注册免费的托管试用帐户.

应用程序设计决策

在Oracle APEX上开发应用程序不需要PL/SQL存储过程,但是它们确实在开发过程中提供了更大的灵活性和自定义.

此示例将使用流行的架构对象:EMP通常作为每个Oracle数据库安装的可选部分提供.如果您没有它,这里是用于构建示例表的DDL和DML源:

EMP(A复印别名为:LAB01_SAMPLE_EMP)

 CREATE TABLE  "EMP"
    (    "EMPNO" NUMBER(4,0) NOT NULL ENABLE,
     "ENAME" VARCHAR2(10),
     "JOB" VARCHAR2(9),
     "MGR" NUMBER(4,0),
     "HIREDATE" DATE,
     "SAL" NUMBER(7,2),
     "COMM" NUMBER(7,2),
     "DEPTNO" NUMBER(2,0),
      PRIMARY KEY ("EMPNO") ENABLE
    )
 /
 ALTER TABLE  "EMP" ADD FOREIGN KEY ("MGR")
       REFERENCES  "EMP" ("EMPNO") ENABLE
 /
Run Code Online (Sandbox Code Playgroud)

如果你想要一些测试数据,这就是我必须使用的:

HR表的HR数据样本

  1. 构建基于SQL的DML更新语句,该语句将根据用户一次更改SAL一个员工的(工资)值ENAME.

  2. 将UPDATE DML语句WRAP到可重用的,已编译的PL/SQL存储过程中.包含"名称"和"增加量"的两个数据输入值的参数参数.

  3. 测试存储过程并验证它是否按要求工作.

  4. 设计和代码APEX应用页面将:

    (a)显示员工实体表的当前内容.(b)接受输入值以传递到PL/SQL存储过程.(c)利用原生APEX ErrorSuccess消息设置,提供有关程序调用结果的更多反馈.

  5. 测试APEX页面并验证其是否按指定工作.

  6. 回顾最后的讨论和结论部分,以获得更多的意见和更多提示,让您继续沿着自己的方式开发Oracle技能.

编写SQL DML进程

这是为完成此任务而创建的初始示例.

    UPDATE LAB01_SAMPLE_EMP
       SET SAL = SAL + 1250
     WHERE ENAME = 'KING';
Run Code Online (Sandbox Code Playgroud)

快速修订版揭示了我们如何参数化这种陈述的方法

    UPDATE LAB01_SAMPLE_EMP
       SET SAL = SAL + p_salary_increase
     WHERE ENAME = p_ename;
Run Code Online (Sandbox Code Playgroud)

如果你不确定下一步该去哪里,这就是APEX提供的"最佳实践"课程.导航到OBJECT BROWSER并创建一个过程对象.应用程序将遍历每个步骤以设置PL/SQL存储过程.

通过APEX设置Oracle PL/SQL存储过程

工作PL/SQL过程源代码:

完成向导设置后,这是已清理的存储过程.调试一些编译时错误警告后,还有一些其他更改:

 create or replace procedure "PROC_UPDATE_SALARY"
    (p_ename IN VARCHAR2, p_salary_increase IN VARCHAR2)
 is

 v_new_salary   lab01_sample_emp.sal%TYPE;       

 begin

       UPDATE LAB01_SAMPLE_EMP
          SET SAL = SAL + p_salary_increase
        WHERE ENAME = p_ename
    RETURNING SAL INTO v_new_salary;

 commit;

 dbms_output.put_line('INCREASED SALARY FOR: ' || p_ename ||
     ' TO THE NEW AMOUNT OF: $ ' || to_char(v_new_salary));

 end;
Run Code Online (Sandbox Code Playgroud)

最佳实践,快速旁白和讨论: 你只需要继续这样做......编码就是这样.没有办法绕过它.寻找工作或生活中的例子,并尝试开发模式和设计,以满足成熟但现实的要求.对于初学者来说,上面的PL/SQL存储过程可能已经显示了一些"不熟悉的"或奇怪的编码语法和命令.

这只是那里可能的一小部分.编码风格也只是它的一部分,当你深入了解事物时,你可能会注意到一些事情:

  1. 组织很重要.快速了解命名和符号中的一些约定以在代码中使用.这将使事情井井有条,易于在其他地方找到或参考.

  2. RECYCLE和REUSE意味着您的代码应该在重用时开发.应将通用例程和进程捆绑在一起以避免冗余.

  3. 总是测试你的工作表明,在你继续进行之前,你的过程或应用程序中的初始基本步骤已经过仔细测试,从而减少了挫败感.

测试Oracle PL/SQL过程

我使用SQL WORKSHOP了环境部分中的内置APEX脚本引擎.下面是我的测试脚本的输出日志的屏幕截图.

自定义PL/SQL存储过程测试输出

将它们结合在一起:使用过程调用设计APEX应用程序页面

创建或打开APEX应用程序,然后通过创建新页面开始.如果您以前没有这样做,有一些系统向导过程可以帮助您入门.

APEX表格向导屏幕

选择BUILDa FORM之上的选项STORED PROCEDURE.将提示创建输入参数所需的页面项的权限.按照向导完成以确保包含所有相关页面设计元素.

我的近乎完成的设计如下:

添加了一些附加功能,例如REPORT提供表的即时可见性的区域以及对其数据的任何应用更改.

HREX环境管理计划数据的APEX表格和报告页面

行动表格:测试数据输入和结果

APEX表单提交后端存储过程操作

SUCCESS警报消息是一个功能可用于某些页面元素通知数据库上进行任何显著事件的用户.

结束评论和讨论

对OP问题的直接回答是肯定的,有最好的做法.这是一个如此巨大的主题,处理它的唯一现实方法是通过不同的例子来看看这些实践"通常"应用的方式.

这个解决方案中有一些快捷方式(基于几个假设),并且可能有助于将它们作为一个分离讨论,讨论重新审视这个演练以进行改进的EMP-2.0项目的可能性.

  • 该过程EMP基于搜索的方式在表上工作ENAME.这张桌子的REAL键是什么?这种方法是否存在任何风险 - 可能涉及更大的数据集?

  • 生产就绪环境中使用的大多数Oracle PL/SQL对象都有一定程度的错误捕获或异常处理PL/SQL EXCEPTION BLOCK.你想要陷入什么样的错误?怎么样?

不要低估APEX工具中可用的资源.有许多向导可以让开发人员完成创建不同功能的代码模块的过程.这些自动化指南提供的解决方案也可以进行逆向工程,以了解代码的生成方式以及通用设计方法的合规设计模式.