簡體   English   中英

如何在Perl DBI中獲取動態SQL輸出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM