[英]How to fetch dynamic SQL output in Perl DBI?
我有一個使用PL / SQL代碼生成的動態SQL SELECT
語句。
declare
sql_query clob;
begin
sql_query := 'select * from ...........';
execute immediate sql_query;
end;
我想將上述動態生成的SELECT
語句的輸出檢索到Perl中的數組中。 我已經在Perl中嘗試過的是
$sql = "declare
sql_query clob;
begin
sql_query := 'select * from ...........';
execute immediate sql_query;
end;";
$sql_prep = $dbh->prepare($sql) or die "Cannot prepare.";
$sql_prep->execute() or die "Cannot execute.";
while (@row = $sql_prep->fetchrow_array ()) {
print "@row\n";
}
我得到的錯誤是,
DBD::Oracle::st fetchrow_array failed: ERROR no statement executing (perhaps you need to call execute first) [for Statement "declare
........
........
"] at ./script.pl line 60.
我是PL / SQL的新手,不確定我是否遵循正確的路徑。 有人可以建議我嗎?
提前致謝!
-Shaakunthala
將來在您發布時,如果您顯示更多代碼,可能會有所幫助-在這種情況下,完整的SQL可能會有所幫助,並至少確定哪一行引發了錯誤(它說第60行,而您沒有第60行)。
您無法做您想做的事。 您可以在Perl中動態創建SQL並傳遞它以准備,執行然后獲取fetchXXX(或使用select *方法之一),或者如果您需要在PL / SQL中動態創建SQL,則需要創建一個過程它返回SYS_REFCURSOR(有關示例,請參見DBD :: Oracle)。
正如先前的海報中提到的do方法,您似乎誤解了他,您應該意識到do和prepare / execute之間的區別。 do不返回語句句柄(它返回指示操作成功或受影響的行數的狀態)。 結果,您無法使用do取回任何行,因為沒有語句句柄可以調用fetch。 do方法通常用於DDL或插入/更新/刪除語句。
prepare方法返回一個語句句柄,因此,如果SQL是select語句,則可以從中獲取行。
如果我誤解了您要做什么,請告訴我,我可以舉一些例子。
我對PL / SQL並不是特別熟悉,但是我確實知道您的SQL字符串看起來很像多個語句,並且出於安全起見,DBI一次只能執行一個語句。 也許它只是運行declare
而忽略其余部分。
有這種理由而不是直接運行select
嗎? (相同的代碼,除了$sql
設置為select * from ..........
而沒有多余的位。)如果您嘗試在更一般的情況下動態聲明存儲過程,則可以(或者可能沒有)使用DBI的do
方法更好地運氣,而不是prepare
/ execute
來聲明它,然后使用execute
作為單獨的步驟運行它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.