[英]Why do I get no output from this query (searching database for string)?
我是 Oracle/PL/SQL Developer 新手,我正在努力弄清楚如何查看此查詢的 output:
DECLARE
ncount NUMBER;
vwhere VARCHAR2(1000) := '';
vselect VARCHAR2(1000) := ' select count(1) from ';
vsearchstr VARCHAR2(1000) := '1301 250 Sage Valley Road NW';
vline VARCHAR2(1000) := '';
istatus INTEGER;
BEGIN
DBMS_OUTPUT.ENABLE;
FOR k IN (SELECT a.table_name, a.column_name FROM user_tab_cols a WHERE a.data_type LIKE '%VARCHAR%')
LOOP
vwhere := ' where ' || k.column_name || ' = :vsearchstr ';
EXECUTE IMMEDIATE vselect || k.table_name || vwhere
INTO ncount
USING vsearchstr;
IF (ncount > 0)
THEN
dbms_output.put_line(k.column_name || ' ' || k.table_name);
ELSE
dbms_output.put_line('no output');
END IF;
END LOOP;
dbms_output.get_line(vline, istatus);
END;
我從https://community.oracle.com/tech/developers/discussion/2572717/how-to-search-a-particular-string-in-whole-schema得到了這個腳本。 它應該在整個數據庫中找到一個字符串( vsearchstr
)。 當我在 PL/SQL Developer 14.0.6 中運行它時,它沒有吐出錯誤,說它花了 0.172 秒,但我沒有看到任何 output。 我期待 output 顯示在 Output 選項卡下:
我知道數據庫中存在字符串“1301 250 Sage Valley Road NW”,因此應該可以找到它。 即使沒有,ELSE 塊也應該輸出“無輸出”。
據我了解, dbms_output.put_line() 將給定的字符串添加到緩沖區,而 dbms_output.get_line() 將其打印到 output 目標(無論它設置為什么)。 我知道需要啟用 dbms_output (因此行DBMS_OUTPUT.ENABLE
)和 dbms_output.get_line() 只會在它所在的 BEGIN/END 塊完成后運行(我不知道這是否意味着它必須放在BEGIN/END 塊,但每次我都無法避免某些錯誤)。
我已經閱讀了有關此問題的各種 stackoverflow 帖子,以及一些外部站點:
https://docs.oracle.com/cd/F49540_01/DOC/server.815/a68001/dbms_out.htm#1000449 https://www.tutorialspoint.com/plsql/plsql_dbms_output.htm
...但似乎沒有任何效果。
我怎么能看到output,或者如果上面的查詢有問題,你能告訴它是什么嗎?
謝謝。
要在 PL/SQL Developer 中從DBMS_OUTPUT
啟用 output,請參閱此答案。
我正在為數據庫中的所有模式尋找
user_tab_cols
的替代關鍵字
當您沒有足夠的權限來讀取表時,使用ALL_TAB_COLS
並捕獲異常(並使用帶引號的標識符來匹配用戶/表/列名的大小寫):
DECLARE
found_row PLS_INTEGER;
vsearchstr VARCHAR2(1000) := '1301 250 Sage Valley Road NW';
BEGIN
FOR k IN (SELECT owner,
table_name,
column_name
FROM all_tab_cols t
WHERE data_type LIKE '%VARCHAR%'
-- Ignore columns that are too small
AND data_length >= LENGTH(vsearchstr)
-- Ignore all oracle maintained tables
-- Not supported on earlier Oracle versions
AND NOT EXISTS (
SELECT 1
FROM all_users u
WHERE t.owner = u.username
AND u.oracle_maintained = 'Y'
)
)
LOOP
DECLARE
invalid_privileges EXCEPTION;
PRAGMA EXCEPTION_INIT(invalid_privileges, -1031);
BEGIN
EXECUTE IMMEDIATE 'SELECT 1 FROM "' || k.owner || '"."' || k.table_name || '" WHERE "' || k.column_name || '" = :1 AND ROWNUM = 1'
INTO found_row
USING vsearchstr;
dbms_output.put_line('Found: ' || k.table_name || '.' || k.column_name);
EXCEPTION
WHEN invalid_privileges THEN
NULL;
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Not found: ' || k.table_name || '.' || k.column_name);
END;
END LOOP;
END;
/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.