【问题标题】:Oracle problem adding debug information to procedureOracle问题将调试信息添加到过程
【发布时间】:2022-01-13 19:42:58
【问题描述】:

我正在尝试将一些调试信息添加到我的程序中,尽管其中大部分已被注释掉,但我似乎无法编译它。问题似乎在第 29 行。任何帮助将不胜感激。

create or replace
  procedure drop_partition(
                           p_tab varchar2,
                           p_date date
                          )
    authid current_user
    is
        v_high_value date;
        v_sql_stmt varchar2(200);
        cursor v_cur
          is
            select  table_name,
                    partition_name,
                    high_value,
                    partition_position
              from  user_tab_partitions
              where table_name = upper(p_tab);
    begin
        for v_rec in v_cur loop
          execute immediate 'select ' || v_rec.high_value || ' from dual'
            into v_high_value;
  
  if ( v_high_value <=
          trunc(p_date)) and 
v_rec.partition_position != 1
      then
     dbms_output.put_line ('partition ' || v_rec.partition_name || ' high value is ' || to_char(v_high_value,'mm/dd/yyyy'));

-- v_sql_stmt :=
 'EXECUTE IMMEDIATE ALTER TABLE ' || p_tab || ' DROP PARTITION FOR(DATE ' || TO_CHAR(v_high_value,'YYYY-MM-DD') || ')';

v_sql_stmt := 'execute immediate alter table '||p_tab||' drop partition '||v_rec.partition_name';';


--dbms_output.put_line(v_sql_stmt);

--EXECUTE IMMEDIATE v_sql_stmt;

    end if;    
  end loop;
end;
/

【问题讨论】:

  • v_sql_stmt := 'execute immediate alter table '||p_tab||' drop partition '||v_rec.partition_name';'; 在最终文字前缺少 ||
  • 为什么要跳过分区号 1?
  • 这是我现在保留旧数据的地方,直到做出决定。我建议购买更多的 4 个磁盘(更慢),我可以交换分区。底线是高层管理人员无法做出决定,所以我会一直保留,直到我得到进一步的指示。

标签: oracle debugging procedure


【解决方案1】:
v_sql_stmt := 'execute immediate alter table '||p_tab||' drop partition '||v_rec.partition_name';';

在结尾处缺少|| 运算符。

您也不想在要使用EXECUTE IMMEDIATE 执行的字符串中使用EXECUTE IMMEDIATE

类似这样的:

create procedure drop_partition(
  p_tab varchar2,
  p_date date
) authid current_user
is
  v_high_value date;
  v_sql_stmt varchar2(200);
  cursor v_cur is
    select table_name,
           partition_name,
           high_value,
           partition_position
    from   user_tab_partitions
    where  table_name = upper(p_tab);
begin
  for v_rec in v_cur loop
    execute immediate 'select ' || v_rec.high_value || ' from dual' into v_high_value;
    if     v_high_value <= trunc(p_date)
       and v_rec.partition_position != 1
    then
      dbms_output.put_line (
        'partition ' || v_rec.partition_name || ' high value is '
        || to_char(v_high_value, 'mm/dd/yyyy')
      );

      v_sql_stmt := 'alter table '||p_tab||' drop partition '||v_rec.partition_name;

      dbms_output.put_line(v_sql_stmt);
      EXECUTE IMMEDIATE v_sql_stmt;
    end if;    
  end loop;
end;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多