2011-03-25 55 views
2

我在名爲Files的表中有一個名爲FileSize的LONG列。如何查找表中長列的長度

爲了實現這一目標,我做了以下內容:

我寫了這個PL/SQL腳本,找到大小

declare 
long_var LONG:=0; 
begin 
dbms_output.put_line(length(long_var)); 
    execute immediate 'SELECT FILESIZE INTO long_var FROM FILES'; 
    dbms_output.put_line(length(long_var)); 
end; 

但它拋出一個錯誤:

ORA-00905: missing keyword 
ORA-06512: at line 5 

我正如我看到下面給出的鏈接下面做以下: http://www.techonthenet.com/oracle/questions/long_length.php

可以有人建議我做錯了,因爲我無法確定我缺少的關鍵詞

謝謝。

回答

6

在這種情況下,您不需要EXECUTE IMMEDIATE。

DECLARE 
long_var long:=0; 
BEGIN 
    DBMS_OUTPUT.PUT_LINE(LENGTH(long_var)); 
    SELECT filesize INTO long_var FROM files; 
    DBMS_OUTPUT.PUT_LINE(LENGTH(long_var)); 
END; 
/

EXECUTE IMMEDIATE從PL/SQL代碼運行獨立的SQL語句。它不能將任何內容返回給您的代碼。您使用的聲明不是有效的SQL,因此您可以獲得ORA-00905。這是有效的PL/SQL代碼,並且如您所期望一旦刪除EXECUTE IMMEDIATE就能正常工作。

編輯

代碼爲您後續的問題:要使用多行做到這一點,你可以用這個

DECLARE 
    CURSOR C1 IS 
    SELECT filesize FROM files; 
BEGIN 
    FOR files IN c1 
    LOOP 
    DBMS_OUTPUT.PUT_LINE(LENGTH(files.filesize)); 
    END LOOP; 
END; 
/
+0

現在,我得到這個錯誤: ORA-01422:精確抓取返回超過請求的行數 ORA-06512:在第5行 – Egalitarian 2011-03-25 10:54:34

+0

您的SELECT只需要一行,但您有很多,因此您需要使用WHERE子句對其進行過濾以獲得唯一一行。如果你想獲得很多行的長度,你需要使用光標。或者,你可以把它變成一個函數,然後在普通的select語句中使用它。 – Lunc 2011-03-25 12:27:33

+0

自從我使用DBMS_OUTPUT包以來已經有一段時間了。記得做「set serveroutput on」 - 另外:不幸的是,當LONG列數據超過32k(至少對於我的32位SQL * Plus客戶端)時,此方法失敗。要檢測長度較大的LONG值,我必須使用此解決方案:http://stackoverflow.com/questions/5497238/get-the-length-of-a-long-raw – nothingisnecessary 2013-07-30 21:57:57