我正在嘗試為資料庫中的每一列獲取示例條目我能想到的最好的東西是:
SELECT owner || '.' || table_name || '.' || column_name AS ex FROM all_tab_cols;
當我這樣做時,我得到了我想要的串列,但是我很難弄清楚如何在 SQL 中回圈。
我想我已經縮小了我想做的事情的范圍,但我一直在弄清楚PUT_LINE
BEGIN
FOR i IN (SELECT owner || '.' || table_name || '.' || column_name AS ex
FROM all_tab_cols)
LOOP
dbms_output.put_line(select * from i fetch first row only);
END LOOP;
END;
/
我嘗試取出第二個選擇并輸入“測驗”,我收到訊息“pl/SQL 程序成功完成”,但沒有輸出。
這是一個 oracle 資料庫,我正在使用 SQL 開發人員。
uj5u.com熱心網友回復:
可能可行的最簡單的事情是
declare
l_sql_stmt varchar2(4000);
l_value varchar2(4000);
begin
for i in (select owner, table_name, column_name
from all_tab_columns)
loop
l_sql_stmt := 'select ' || i.column_name ||
' from ' || i.owner || '.' || i.table_name ||
' fetch first row only';
execute immediate l_sql_stmt
into l_value;
dbms_output.put_line( l_value );
end loop;
end;
但是,這僅在您有權訪問的每個表中的每一列都可以隱式轉換為varchar2(4000). 如果您有lob超過 4000 位元組長度的列,或者您有具有復雜資料型別的列,則會收到錯誤訊息。由于您正在進行隱式轉換,因此您將獲得不同的數字、日期和時間戳結果,具體取決于會話的 NLS 設定,這可能對您有問題,也可能沒有問題。通常明智的做法是至少all_tab_columns在游標中的查詢中添加一個謂詞,以僅選擇您準備處理其資料型別的那些列。
如果您想變得更復雜,您可以使用dbms_sql包來描述結果并將資料提取到適當資料型別的區域變數中。這可以讓您修復隱式轉換問題并讓您處理更多資料型別(盡管,例如,我不知道您想要為blob列顯示什么),但它涉及撰寫更多代碼并且您d 必須明確處理您希望能夠處理的每種資料型別。
根據您嘗試執行此操作的原因,使用優化器至少為具有統計資訊的列收集的列級統計資訊可能更有意義(但這些可能是您真正關心的具有示例資料的列為了)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/424445.html
上一篇:python函式遍歷傳感器名稱串列并在資料框中回傳結果
下一篇:正確使用dowhile回圈?
