Oracle

使用流重定向從 dbms_scheduler 創建作業?

  • June 26, 2017

我想創建一個必須執行此 shell 命令的簡單作業:

echo some_text > some_file

屬性可以在兩次呼叫之間更改,some_text所以我需要使用procedure。some_file``run_job``set_job_argument_value

這是我的程式碼:

exec dbms_scheduler.create_job('write_file','executable','/bin/echo',1,auto_drop=>false);
exec dbms_scheduler.set_job_argument_value('write_file',1,'text > /tmp/file');
exec dbms_scheduler.run_job('write_file');

我首先創建將執行echo命令的作業。這項工作將只需要參數:text > /tmp/file。當我執行我的工作時,程序執行正常,但我的文件沒有創建。就像程序執行這個命令一樣:/bin/echo "text > /tmp/file".

所以我嘗試了多個參數:

exec dbms_scheduler.create_job('write_file','executable','/bin/echo',3,auto_drop=>false);
exec dbms_scheduler.set_job_argument_value('write_file',1,'text');
exec dbms_scheduler.set_job_argument_value('write_file',2,'>');
exec dbms_scheduler.set_job_argument_value('write_file',3,'/tmp/file');
exec dbms_scheduler.run_job('write_file');

相同的輸出,沒有創建文件。

那麼,是否可以指定標準輸入?或者使用這種job_action : /bin/echo $1 > $2

我找到了解決這個問題的更新檔。這個想法是創建一個 bash 文件:

#!/bin/sh
echo $1 > $2

現在,您可以創建並執行您的作業:

exec dbms_scheduler.create_job('write_file','executable','/usr/bin/oracle/transfer',2,auto_drop=>false);
exec dbms_scheduler.set_job_argument_value('write_file',1,'some_text');
exec dbms_scheduler.set_job_argument_value('write_file',2,'/tmp/some_file');
exec dbms_scheduler.run_job('write_file');

你可以看到結果:

$ cat /tmp/some_file
some_text

引用自:https://dba.stackexchange.com/questions/177104