【问题标题】:How to write a stored procedure in oracle?oracle怎么写一个存储过程?
【发布时间】:2012-04-23 13:20:33
【问题描述】:

我是 oracle 新手,所以不确定如何在 oracle 中编写存储过程。目前我正在谷歌上搜索并阅读一些关于 Oracle SP 的文章/博客。我开始对此有了一些想法。即使这样,我也有以下几个问题。

我想做的是,

我有一个 Employee 表,其中包含 emp_id、Region、Division、Product、Title 等。

我还有 emp_update 表,其中包含 emp_id、列(更改的内容)、old_value、new_value 和日期。

例如emp_update 表将有一行 for emp_id = 10,表示区域在 4 月 30 日从亚洲更改为英国。

同一 emp 的另一行表示产品在 4 月 30 日从 A 更改为 B。

因此,同一员工和同一日期的多个条目。

现在在那个特定的日期,我正在运行一个 cron 作业,它将运行这个 Sp 以将员工表更新为这些更新。

例如在 4 月 30 日,更新员工集 region = UK, Product = B 其中 emp_id = 10。

我想为员工运行一条更新语句,其中包含该日期来自 emp_update 表的所有更新。

所以基本上,

从 emp_update 获取所有员工,并在今天更新。 遍历员工更新,将它们组装在单个更新语句中,然后执行该更新查询。 对每个员工重复。

请帮忙

编辑 1:-

    CREATE OR REPLACE
PROCEDURE SP_RUN_EMPLOYEE_UPDATES 
IS


 CURSOR 
    c_emp 
 IS
    SELECT DISTINCT(employee_id) as employee_id FROM BI_EMPLOYEE_UPDATE WHERE EFFECTIVE_DATE = to_date('30-Apr-2012','dd-mm-yy');

BEGIN

FOR employee in c_emp

  LOOP

    CURSOR 
        c_emp_update 
    IS
      SELECT * FROM BI_EMPLOYEE_UPDATE WHERE employee_id = :employee.employee_id AND EFFECTIVE_DATE = to_date('30-Apr-2012','dd-mm-yy');

    FOR emp_update in c_emp_update
    LOOP



  --      dbms_output.put_line(emp_update.column_name);
    END LOOP;

  END LOOP;

END;

目前这是我迄今为止所做的

【问题讨论】:

标签: oracle stored-procedures cursor


【解决方案1】:

这个问题似乎不是关于存储过程,而是更多关于创建动态查询。基本上,你想要这个:

  1. Cron 作业调用存储过程
  2. Proc 将使用今天的日期遍历emp_update 中的记录,按employee_id 排序
  3. 您将根据查询中的值开始为更新语句的 set 表达式 构建动态 SQL。只需将“COLUMN_NAME = NEW_VALUE”一遍又一遍地连接到该员工 ID/日期组合的每一列。
  4. 使用模板 UPDATE EMP SET <previous string here> WHERE EMPLOYEE_ID = <emp_id> 构建您的 SQL。
  5. 执行动态更新sql

【讨论】:

  • 这正是我要找的。但不确定如何在存储过程中实现这一点。我有一个按计划运行并调用这个 sp 的 cron 作业。现在我只需要 sp 里面的东西。
  • 以下是 Oracle 提供的一些关于在 PL/SQL 中创建动态 SQL 的文档:docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg09dyn.htm
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2013-10-12
  • 2011-01-03
  • 2011-12-29
相关资源
最近更新 更多