2013-10-18 21 views
2

我有下列表格,其中狀態列值將在執行informatica工作流程時動態更新。如何在oracle中執行此場景SQL

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服務器

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

回答

0

你在哪裏在SQL服務器上運行這個?我無法想象你的DBA會對此感到非常高興,因爲你在一個循環中一遍又一遍地執行查詢,直到發生某些變化...

你可以用PL/SQL塊,但是你真的不應該這樣做,因爲你每秒鐘執行數百條select語句而沒有在某處進行睡眠。

您可以在oracle和SQL服務器中使用觸發器在行更改時執行某些操作。

例如,您可以運行在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

還是一個DBMS_JOB在Oracle: Can a JOB be created dynamically inside a trigger?

真的,你應該剛剛成立依賴於一個任務informatica工作。如果做不到這一點,輪詢表每30秒有一點點的外部C#或應用程序(或某事),你想要做什麼......

+0

感謝您的意見。我的oracle服務沒有啓動出於某種原因在我的家用電腦這就是爲什麼要在SQL Server上嘗試。我對我的客戶說了同樣的話,如果我想完成這個任務,DBA會直接殺了我,但他們仍然希望我試試看。我沒有VS的訪問權限,所以我不能嘗試輪詢桌子。如果我用觸發器做它,性能如何。你能否給我提供一些關於如何用觸發器做這個事情的例子。上述查詢將運行最多5分鐘。 – Rajkumar

+0

客戶想要什麼? CSV文件導出?查詢將在哪裏保存結果?如果你使用觸發器路由,只要dbo.logging表未被更新數百次,dbo.logging表上的PL/SQL觸發器會檢查相應的「新」值,這對於性能。 –

+0

是的。他們想要一個CSV文件導出。我從Shell腳本運行所有的SQL腳本。我試過觸發選項,它似乎不是一個可行的解決方案。日誌表更新很多次。還有其他選擇嗎? – Rajkumar

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,直到滿足條件。

+0

本質上,是的。您可以將其封裝在一個循環中,然後使用「sleep」命令等待30秒,然後再次嘗試。 –

+0

非常感謝。我今天終於修好了。 – Rajkumar

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