簡體   English   中英

為什么我從這個查詢(搜索數據庫中的字符串)中沒有得到 output?

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

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