标签: plsql

Oracle 11:在巨大的生产表上将全局索引更改为本地索引

我有带有全局索引的大分区表。我的情况是从存档分区中删除旧数据。我不能简单地删除分区,因为我有全局索引。

所以我有想法使用 INVISIBLE local INDEX(计算 12-16h)然后删除全局索引并使新索引可见并将其重命名为刚刚删除的全局索引。

但..

SQL> create index I_EMPLOYEE_SALARY_T on EMPLOYEE (SALARY, DEPARTAMENT) local invisible online;
create index I_EMPLOYEE_SALARY_T on EMPLOYEE (SALARY, DEPARTAMENT) local invisible online
                                              *
ERROR at line 1:
ORA-01408: such column list already indexed
Run Code Online (Sandbox Code Playgroud)

是否还有其他选项可以使用原子/快速操作动态更改 id 将全局索引更改为本地索引?

删除全局索引然后创建新索引是不可接受的。

index plsql

5
推荐指数
1
解决办法
1万
查看次数

Oracle 存储过程中的提交和回滚

在我的 Oracle 存储过程中,我有多个插入和更新语句,如下所示:

create or replace PROCEDURE SPTest
AS 
BEGIN 
  insert into emptest(empid,empname,deptno)
  (1,'ravi',10);

  insert into test1(id,name,sal)
  (1,'raju',4444);

  update emptest set empname='hari' where empid=1;
END;
Run Code Online (Sandbox Code Playgroud)

如果我在任何语句中遇到任何错误,我想回滚所有插入和更新语句。

如何在此存储过程中实现提交和回滚?

oracle oracle-11g plsql

5
推荐指数
1
解决办法
4万
查看次数

PL/SQL 函数接收一个数字并返回其二进制格式

我正在尝试编写一个函数来接收一个数字并返回其二进制格式。这是我迄今为止开发的内容,它可以用于输入:4,8,16 但它不会为其他数字返回正确的二进制格式。我找不到问题,我想知道你是否能找到问题?

create or replace function Show_Binary(i_Number in Number) Return Varchar2 
  AS

     V_Binary varchar2(50) := '';
     i_Number2 Number := i_Number;
       Begin
         While i_Number2>=2 LOOP

          V_Binary := V_Binary || Remainder(i_Number2, 2);
          i_Number2 := i_Number2 / 2;

       End LOOP;
          V_Binary := V_Binary || TO_CHAR(i_Number2);
          select reverse (V_Binary) into V_Binary from dual;
      return (V_Binary);
   End;
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g plsql

5
推荐指数
1
解决办法
2456
查看次数

在 FOR 循环中引用 PL/SQL 变量

我编写了一个 PL/SQL 脚本来查找表中长列的大小。只是为了使脚本通用,我将表名和列名作为变量传递,但我收到一条错误消息,说表或视图不存在。详细信息是:

ORA-06550: line 8, column 34:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 8, column 11:
PL/SQL: SQL Statement ignored
ORA-06550: line 9, column 42:
PLS-00364: loop index variable 'J' use is invalid
ORA-06550: line 9, column 3:
PL/SQL: Statement ignored
Run Code Online (Sandbox Code Playgroud)

脚本是:

declare
a number := 0;
x number := 0;
i number := 0;
tablename varchar2(100):= 'FILES';
columnname varchar2(100):= 'FILESIZE';
begin
for  j in (select columnname from tablename) loop
  a:=UTL_RAW.LENGTH (UTL_RAW.CAST_TO_RAW(j.columnname));
    i := i+1; …
Run Code Online (Sandbox Code Playgroud)

oracle-10g plsql

4
推荐指数
1
解决办法
9708
查看次数

ORA-20000:ORU-10027:缓冲区溢出,限制为 10000 字节

当我尝试执行此查询时出现该错误:

select *
from lc_history2 lc
where  lc.view_name <> 'LC Main'
and lc.modifiedtime = (select max(modifiedtime) from lc_history2 l where lc.lc = l.lc) 
 and lc.modifiedtime >= sysdate-30
Run Code Online (Sandbox Code Playgroud)

oracle plsql

4
推荐指数
1
解决办法
4万
查看次数

PL/Scope 与关联数组结合使用是否存在错误?

我相信我偶然发现了 PL/Scope 与关联数组相结合的错误,但也许我忽略了一些东西。

我有以下包裹

create or replace package tq84_pkg_c as

    procedure proc_1;

end tq84_pkg_c;
/
Run Code Online (Sandbox Code Playgroud)

用它的身体

create or replace package body tq84_pkg_c as

    type num_t is table of number index by varchar2(10);

    procedure proc_2 is begin
        null;
    end proc_2;

    procedure proc_1 is 
        v_num num_t; 
    begin
        if v_num.exists(1) then
           proc_2;
        end if;
    end proc_1;

end tq84_pkg_c;
/
Run Code Online (Sandbox Code Playgroud)

我用“PL/Scope”编译包:

ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL';

ALTER PACKAGE TQ84_PKG_C COMPILE;
Run Code Online (Sandbox Code Playgroud)

然后,我查询all_identifiers

select
  name          identifier,
  usage,
  type,
  usage_id,
  usage_context_id,
  line,
  col
from
  all_identifiers
where …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2 plsql

4
推荐指数
1
解决办法
564
查看次数

Oracle 从两个日期插入最大值

我想在插入两个不同值中较大值的 PL/SQL 脚本中创建一个插入语句。从概念上讲,我想做的是

Insert into MYTABLE (DATE_INSERT)
VALUE (MAX(DATE_DEFAULT, DATE_INSERT_VALUE))
Run Code Online (Sandbox Code Playgroud)

其中DATE_DEFAULTDATE_INSERT_VALUE是 类型的局部变量DATEMAX然而,该函数是一个聚合函数,所以我不能向它传递两个参数。

oracle plsql

4
推荐指数
1
解决办法
1万
查看次数

将参数传递给由 DBMS_SCHEDULER 执行的过程

我有一个调度程序,它运行一个需要输入参数的存储过程。

BEGIN
  DBMS_SCHEDULER.DROP_PROGRAM
    (program_name          => 'MYSCHEMA.EXPORT_SCHEMA_STARTING');
END;
/
BEGIN
  SYS.DBMS_SCHEDULER.CREATE_PROGRAM
    (
      program_name         => 'MYSCHEMA.EXPORT_SCHEMA_STARTING'
     ,program_type         => 'STORED_PROCEDURE'
     ,program_action       => 'MYSCHEMA.EXPORT_STATUS'
     ,number_of_arguments  => 0
     ,enabled              => FALSE
     ,comments             => NULL
    );

  SYS.DBMS_SCHEDULER.ENABLE
    (name                  => 'MYSCHEMA.EXPORT_SCHEMA_STARTING');
END;
/
Run Code Online (Sandbox Code Playgroud)

如何将参数传递给EXPORT_STATUS过程?

到目前为止,我将其更改为运行 PL/SQL BLOCK 的程序:

BEGIN
  SYS.DBMS_SCHEDULER.CREATE_PROGRAM
    (
      program_name         => 'MYSCHEMA.EXPORT_SCHEMA_STARTING'
     ,program_type         => 'PLSQL_BLOCK'
     ,program_action       => 'MYSCHEMA.EXPORT_STATUS(''STARTING''); END;'
     ,number_of_arguments  => 0
     ,enabled              => FALSE
     ,comments             => NULL
    );

  SYS.DBMS_SCHEDULER.ENABLE
    (name                  => 'MYSCHEMA.EXPORT_SCHEMA_STARTING');
END;
/
Run Code Online (Sandbox Code Playgroud)

它按我的预期工作。但是,如果有人知道如何将其保留为以前的格式,我们将不胜感激。

oracle oracle-11g plsql jobs

4
推荐指数
1
解决办法
3万
查看次数

在oracle中检查当前密码时如何更改用户密码?

在我的应用程序中,我有一个更改密码表单,用户可以在其中输入当前密码和新密码。然后我使用以下命令更改他们的密码:

alter user user_name identified by new_password;
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道如何检查用户在表单中输入的当前密码是否正确(因为密码是在oracle中加密的)

我该怎么做?

oracle plsql

4
推荐指数
1
解决办法
4669
查看次数

在 sqlplus 脚本中出现错误时停止

我正在使用多个 .sql 调用的 sql 文件部署 pl/sql 代码@@file。如果包出现编译错误,脚本会继续执行到最后。

有没有办法停止每个编译错误?

我试过了,WHENEVER SQLERROR EXIT SQL.SQLCODE但脚本仍在继续。

oracle sqlplus plsql oracle-sql-developer

3
推荐指数
1
解决办法
5303
查看次数