2

我有下表,其中状态列值将在执行 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。

4

3 回答 3

0

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

你可以用 PL/SQL 块来做这件事,但你真的不应该这样做,因为你每秒执行数百个选择语句而没有在某个地方休眠。

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

例如,您可以在 SQL 服务器中运行 SQL 代理作业:http: //social.msdn.microsoft.com/Forums/en-US/b672ee45-7198-4783-8143-2908f8a954d2/how-to-execute-sql-服务器代理作业来自触发器

或者 oracle 中的 dbms_job: 可以在触发器内动态创建 JOB 吗?

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

于 2013-10-18T20:06:24.510 回答
0
#!/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
于 2013-10-22T19:51:42.490 回答
0
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 直到满足条件。

于 2013-10-21T20:34:28.193 回答