【问题标题】:Reason for Sql command not ended properly errorSql 命令未正确结束的原因错误
【发布时间】:2021-05-25 20:03:35
【问题描述】:

当我执行以下代码时,sql 命令没有正确结束。 我正在使用它来查找字符串的匹配列。

DECLARE
  match_count INTEGER;
BEGIN
  FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP

    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '||t.table_name||' WHERE lower('||t.column_name||') like :1'
    INTO match_count
    USING 'XRWJ01';

    IF match_count > 0 THEN
      dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
    END IF;

  END LOOP;
END;
/

【问题讨论】:

  • 您使用的是 MySQL 还是 Oracle? (该代码不会在两者上运行。)
  • 将字符串保存到参数并打印出参数。当您看到正在执行的内容时,这些问题通常很明显。
  • 请发布您正在运行的实际代码。您发布的代码在到达“SQL 命令未正确结束”之前很久就引发了其他错误。例如,您必须在代码中使用未声明的变量。这将是解析器标记的第一个错误。发布简化代码是可以的,但前提是它与原始代码有相同的问题。 在此处发布之前更改您的代码,直到它引发与您抱怨的相同的错误;否则就是一团糟。

标签: sql oracle plsql procedure


【解决方案1】:

调试您的代码...如果您遇到错误,请打印出错的语句。我对你的 pl/sql 块做了一些小的改动。将 v_owner 和 v_datatype 替换为您的值以运行它。

set serveroutput on size 999999
clear screen
DECLARE
  match_count INTEGER;
  v_owner VARCHAR2(30);
  v_data_type VARCHAR2(30);
  v_stmt VARCHAR2(1024);
BEGIN
  v_owner := 'SCOTT';
  v_data_type := 'NUMBER';
  FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP
    v_stmt := 'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" like :1';

    BEGIN
      EXECUTE IMMEDIATE 
        v_stmt
      INTO match_count
      USING 'XRWJ01';
    EXCEPTION WHEN OTHERS THEN
      dbms_output.put_line( 'Error in statement: '|| v_stmt );
      dbms_output.put_line ( DBMS_UTILITY.FORMAT_ERROR_STACK() );
      dbms_output.put_line ( DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() );      
    END;
    
    IF match_count > 0 THEN
      dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
    END IF;

  END LOOP;
END;
/

我在本地运行该语句,但由于LOWER('||t.column_name||') 而出错。您从数据字典中选择列 - 这些列名。如果您执行 LOWER,那么如果表/列是使用大小写创建的,那么您可能会有不同的值。解决方案是不要做 LOWER 并在它们周围加上双引号。

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多