【问题标题】:how to do this scenario in oracle SQL如何在 oracle SQL 中执行此场景
【发布时间】:2013-10-18 19:30:16
【问题描述】:

我有下表,其中状态列值将在执行 informatica 工作流时动态更新。

CREATE TABLE [dbo].[logging](
[id] [int] NULL,
[workflow] [nvarchar](20) NULL,
[status] [int] NULL
    ) ON [PRIMARY]
insert into dbo.logging values(2,'wf_d','5')
insert into dbo.logging values(3,'wf_d','6')
insert into dbo.logging values(4,'wf_d','4')

当特定行的状态列的值变为 3(在此示例中 id=4)时,我需要显示某个表中的所有行,例如示例产品。如何在 oracle SQL 中执行此操作。 我在 SQL Server 中为这个问题找到了一些肮脏的解决方案

DECLARE @compareprice int
label:
set @compareprice = (select status from logging where id=4)
if (@compareprice = 3)
select * from dbo.products;
else
goto label;

在执行此代码时,表日志记录中 id=4 的状态码将变为 3。

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

    您在 SQL Server 中的哪个位置运行它?我无法想象您的 DBA 会对此感到非常高兴,因为您在循环中一遍又一遍地执行查询,直到某些事情发生变化......

    您可以使用 PL/SQL 块来执行此操作,但实际上不应该这样做,因为您每秒执行数百个 select 语句而没有在某处休眠。

    您可以在 oracle 和 SQL Server 中使用触发器来在行更改时执行某些操作。

    例如,您可以在 SQL Server 中运行 SQL 代理作业: http://social.msdn.microsoft.com/Forums/en-US/b672ee45-7198-4783-8143-2908f8a954d2/how-to-execute-sql-server-agent-job-from-trigger

    或 oracle 中的 dbms_job: Can a JOB be created dynamically inside a trigger?

    真的,您应该只设置一个依赖于 informatica 作业的任务。如果做不到这一点,请每 30 秒使用一点外部 C# 或应用程序(或其他东西)来轮询一次表...

    【讨论】:

    • 感谢您的想法。我的 oracle 服务由于某种原因在我的家用 PC 上没有启动,这就是为什么在 SQL Server 上尝试这个。我对我的客户说了同样的话,如果我想完成这项任务,DBA 会真的杀了我,但他们仍然希望我试一试。我无法访问 VS,所以我无法尝试轮询表。如果我使用触发器执行此操作,性能将如何。你能给我一些例子来说明如何用触发器做到这一点。上面的查询最多会运行 5 分钟。
    • 客户想要什么? CSV 文件导出?查询将在哪里保存其结果?如果你走触发器路线,只要 dbo.logging 表没有被更新数百次,在 dbo.logging 表上检查适当的“新”值的 PL/SQL 触发器不应该是坏的性能。
    • 是的。他们想要一个 CSV 文件导出。我从 Shell 脚本运行所有 SQL 脚本。我尝试了触发选项,但它似乎不是一个可行的解决方案。记录表更新了很多次。我还有其他选择吗?
    • 如果您只需要 CSV 导出,为什么不在 Informatica 运行更新数据的作业后运行 Informatica 任务来选择数据并转储到文件。有什么方法可以绑定到该 informatica 作业并在完成后运行 shell 脚本?修改了KSH等??
    • 不,那是不可能的。客户端以非常不同的方式使用 informatica,因此可以直接使用 pmcmd 获取信息。所以我现在别无选择。还剩吗
    【解决方案2】:
    X=$(sqlplus -s user/pass << !
    set heading off
    set feedback off
    select status from logging where id=4;
    )
    echo $X
    if [ $X -eq 3 ]; 
     then
      (sqlplus -s user/pass << !
        set heading off
        set feedback off
            select * from products;
    )
    fi
    

    这是您所指的选项吗?现在我如何多次运行 SQL 直到满足条件。

    【讨论】:

    • 基本上,是的。您可以将其包装在一个循环中并使用sleep 命令等待 30 秒后再重试。
    • 非常感谢。我今天终于修好了。
    【解决方案3】:
    #!/bin/sh
    start() {
    v=`sqlplus -s <<!
    HR/HR
    set pages 0 echo off feed off
    select distinct status from
    emp
    where
    id=5;
    !
    `
    echo $v;
    
    }
    while :
    do
      rval=`start`
      if [ "$rval" -eq 4 ]
      then
        echo if condition true
        sqlplus -l scott/tiger <<EOF
        select * from department;
        EXIT
    EOF
        break
      else
         sleep 30
      fi
    done
    

    【讨论】:

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