【问题标题】:Why I cannot run this script in SQL Developer?为什么我不能在 SQL Developer 中运行这个脚本?
【发布时间】:2016-06-27 20:34:28
【问题描述】:

伙计们,我真的需要你们的帮助。我已经写了几行代码,现在我被卡住了,因为我无法在 SQL Developer 中运行以下程序。

程序

create or replace 
PROCEDURE ROUTSETTER(
    var IN VARCHAR2)
IS
  COUNT_RECORDS NUMBER       := 0;
  BASE_TABLE    VARCHAR2(20) := 'DROGA';
  NEW_TABLE     VARCHAR2(20) := 'DROGA_COPY';
BEGIN
  SELECT COUNT(*)
  INTO COUNT_RECORDS
  FROM ALL_OBJECTS
  WHERE OBJECT_TYPE = 'TABLE'
  AND OBJECT_NAME   = NEW_TABLE;
  IF COUNT_RECORDS  > 0 THEN
    EXECUTE IMMEDIATE 'TRUNCATE TABLE '||NEW_TABLE;
    dbms_output.put_line('TABLE '||NEW_TABLE||' HAS BEEN TRUNCATED');
  ELSE
    EXECUTE IMMEDIATE 'CREATE TABLE '||NEW_TABLE||' AS SELECT * FROM '||BASE_TABLE||' WHERE WYCENA = '||var;
    dbms_output.put_line('TABLE '||NEW_TABLE||' HAS BEEN CREATED');
  END IF;
END ROUTSETTER;

错误

ORA-00933: SQL command not properly ended
ORA-06512: at "PROJEKT.ROUTSETTER", line 17
ORA-06512: at line 6

【问题讨论】:

  • 你是说你不能创建它还是真的不能运行它?如果是后者,您如何尝试运行它?
  • 简单地说:exec rousetter('IV.4');

标签: oracle stored-procedures plsql oracle-sqldeveloper


【解决方案1】:

你的线路;

EXECUTE IMMEDIATE 'CREATE TABLE '||NEW_TABLE||
     ' AS SELECT * FROM '||BASE_TABLE||' WHERE WYCENA = '||var;

...将var(它是一个varchar)直接放入SQL 语句中而无需适当的引用。

如果我们假设 var 没有单引号,你的行应该是这样的;

EXECUTE IMMEDIATE 'CREATE TABLE '||NEW_TABLE||
     ' AS SELECT * FROM '||BASE_TABLE||' WHERE WYCENA = '''||var||'''';

【讨论】:

  • 是的!我发现在调用立即执行之前打印出任何动态创建的 SQL 语句很有用。这有助于指出这些简单但令人讨厌的错误。
  • @GeeBee 添加你用来打印它们的命令可能对其他有同样问题的人有用:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多