我有带有全局索引的大分区表。我的情况是从存档分区中删除旧数据。我不能简单地删除分区,因为我有全局索引。
所以我有想法使用 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 将全局索引更改为本地索引?
删除全局索引然后创建新索引是不可接受的。
在我的 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)
如果我在任何语句中遇到任何错误,我想回滚所有插入和更新语句。
如何在此存储过程中实现提交和回滚?
我正在尝试编写一个函数来接收一个数字并返回其二进制格式。这是我迄今为止开发的内容,它可以用于输入: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) 我编写了一个 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) 当我尝试执行此查询时出现该错误:
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) 我相信我偶然发现了 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) 我想在插入两个不同值中较大值的 PL/SQL 脚本中创建一个插入语句。从概念上讲,我想做的是
Insert into MYTABLE (DATE_INSERT)
VALUE (MAX(DATE_DEFAULT, DATE_INSERT_VALUE))
Run Code Online (Sandbox Code Playgroud)
其中DATE_DEFAULT和DATE_INSERT_VALUE是 类型的局部变量DATE。MAX然而,该函数是一个聚合函数,所以我不能向它传递两个参数。
我有一个调度程序,它运行一个需要输入参数的存储过程。
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)
它按我的预期工作。但是,如果有人知道如何将其保留为以前的格式,我们将不胜感激。
在我的应用程序中,我有一个更改密码表单,用户可以在其中输入当前密码和新密码。然后我使用以下命令更改他们的密码:
alter user user_name identified by new_password;
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何检查用户在表单中输入的当前密码是否正确(因为密码是在oracle中加密的)
我该怎么做?
我正在使用多个 .sql 调用的 sql 文件部署 pl/sql 代码@@file。如果包出现编译错误,脚本会继续执行到最后。
有没有办法停止每个编译错误?
我试过了,WHENEVER SQLERROR EXIT SQL.SQLCODE但脚本仍在继续。