标签: plsql

Oracle 的服务器结果缓存的功能

我正在阅读Oracle 概念文档并有疑问 [关于一般缓存机制]:

PL/SQL 函数代码可以包括缓存其结果的请求。调用此函数时,系统会检查缓存。如果缓存包含具有相同参数值的先前函数调用的结果,则系统将缓存的结果返回给调用者并且不重新执行函数体。如果缓存中不包含结果,则系统执行函数体并将结果(对于这些参数值)添加到缓存中,然后再将控制权返回给调用者

我的疑问:

执行 PL/SQL 函数后,其结果集存储在缓存中。然后 DDL 语句更改表/索引/函数使用的任何内容...

如果我现在运行相同的 PL/SQL 函数,我会得到相同的结果还是更新的结果?

oracle plsql cache

2
推荐指数
1
解决办法
204
查看次数

有没有办法只传递一次变量立即执行但多次使用它?

我有一个 Cursor 从脚本中获取数据:

OPEN myCursor FOR
SELECT value1 AS Value1,
  myPackage.function1 (value1, :myId) AS Result1,
  myPackage.function2 (value1, :myId) AS Result2,
  myPackage.function3 (value1, :myId) AS Result3                       
FROM mySchema.myTable
WHERE tpk = :myPk
USING myId, myId, myID
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用了myId变量 3 次,并且必须在 using 语句中将其传递 3 次才能使其工作。我在任何地方都找不到它,但是有没有办法只传递myId变量一次?

oracle plsql

2
推荐指数
1
解决办法
354
查看次数

我可以在具有相同名称的分区的两个表之间交换分区吗?

我正在尝试从备份表中恢复一个分区。两个表都有同名的分区。我的目标是从备份表分区 x 中抓取数据并将其放入原始表分区 x。x 是分区的名称。

我试图通过使用辅助表来做到这一点。有没有办法直接交换它们或任何其他性能更好的解决方案?

performance oracle oracle-11g-r2 plsql partitioning performance-tuning

2
推荐指数
1
解决办法
7571
查看次数

将(逗号分隔)-但单个参数传递给游标

我必须选择传递给光标的给定字符串(用逗号分隔的值)。可以有多个值可以通过单个变量传递。我的代码有点像:

CURSOR My_Cursor( vsStr1 )
  IS
  SELECT some_field
    FROM some_table
   WHERE txtfield1 IN ( vsStr1 );    --this field is varchar2 type

vsStr1 varchar2(100) := '01, 25, 80, 100';
Run Code Online (Sandbox Code Playgroud)

如何传递该变量正确性?任何帮助,将不胜感激。

oracle plsql cursors

2
推荐指数
1
解决办法
7234
查看次数

在 Oracle 上使用插入语句的最佳方法

我需要将来自客户和公司的地址存储到具有相同列的不同表中。我想知道使用相同的插入语句的最佳方法是什么,但只能通过更改表的名称。

例子:

CASE CPF
 WHEN NULL
  INSERT INTO COMPANIES_ADDRESS (ZIPCODE, STREET, NUMBER) VALUES (V_ZIPCODE, V_STREET, V_NUMBER)
 ELSE
  INSERT INTO CUSTOMERS_ADDRESS (ZIPCODE, STREET, NUMBER) VALUES (V_ZIPCODE, V_STREET, V_NUMBER)
END
Run Code Online (Sandbox Code Playgroud)

oracle plsql

2
推荐指数
1
解决办法
72
查看次数

为表中的每个条目生成 `insert` 语句

insert从表中的每个条目生成语句的最简单方法是什么?对于 3 行的表,我需要生成 3 个插入语句。

对于具有n行的表,我需要写入文件n insert语句。

例如,对于 row (foo, bar, baz) 我需要将语句写入该文件:

insert into desired_table values (foo, bar, baz)
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2 plsql

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

异常逻辑在 Oracle PL/SQL 函数中不起作用

这些是我创建并插入了一些值的表:

CREATE TABLE DEPARTMENT
(DEPARTMENT_ID NUMBER PRIMARY KEY,
 DEPARTMENT_NAME VARCHAR(30) NOT NULL
 );

CREATE TABLE EMPLOYEES
(EMPLOYEE_ID NUMBER PRIMARY KEY,
 FIRST_NAME VARCHAR(20) NOT NULL,
 LAST_NAME VARCHAR(25) NOT NULL,
 EMAIL VARCHAR(25) NOT NULL,
 PHONE_NUMBER VARCHAR(20) NOT NULL,
 HIRE_DATE DATE NOT NULL,
 JOB_ID NUMBER NOT NULL,
 SALARY DECIMAL NOT NULL,
 DEPARTMENT_ID NUMBER NOT NULL,
 CONSTRAINT emp_job_fk FOREIGN KEY(JOB_ID) REFERENCES JOBS(JOB_ID),
 CONSTRAINT emp_department_fk FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(DEPARTMENT_ID)
 );

INSERT INTO DEPARTMENT (DEPARTMENT_ID,DEPARTMENT_NAME)
VALUES(1,'IT');
INSERT INTO DEPARTMENT (DEPARTMENT_ID,DEPARTMENT_NAME)
VALUES(2,'Sales');
INSERT INTO DEPARTMENT (DEPARTMENT_ID,DEPARTMENT_NAME)
VALUES(3,'Accounting'); …
Run Code Online (Sandbox Code Playgroud)

oracle plsql functions

2
推荐指数
1
解决办法
963
查看次数

在Exception语句中执行sql文件

嗨,当我执行假脱机文件时,我试图在异常语句中执行 SQL 文件。

我有这样的事情:

column dt new_value _dt 
select to_char(sysdate,'yyyymmdd_hh24mi') dt from dual; 
set line 10000;
set pagesize 50000;
set serveroutput on;

spool .\backup\backup.sql

select dbms_metadata.get_ddl(object_type, object_name)
from user_objects
where object_type in ('FUNCTION')
and object_name = 'TEST_TABLE';

Spool Off

spool .\!Run_&_dt..txt

BEGIN
    raise_application_error( -20001, 'This is a custom error' );
EXCEPTION 
    WHEN OTHERS THEN
        Prompt ./backup/backup.sql
        @ ./backup/backup.sql
END;

Spool Off
Run Code Online (Sandbox Code Playgroud)

我得到下一个错误:

>> BEGIN
     raise_application_error( -20001, 'This is a custom error' );
EXCEPTION 
    WHEN OTHERS THEN
        Prompt ./backup/backup.sql
        @ ./backup/backup.sql …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2 plsql

2
推荐指数
1
解决办法
682
查看次数

如何在 Oracle 调度程序作业中调用存储过程

我想在 Oracle 调度程序作业中调用存储过程。我的程序和工作如下所示:

存储过程

create or replace PROCEDURE emp_test                                              
IS
begin

delete from  emp;
insert into emp(empid,empname)
select empid1,empname1 from emp_temp;
end;
Run Code Online (Sandbox Code Playgroud)

工作

BEGIN
dbms_scheduler.create_job (
job_name => 'emp_test_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN
CALL emp_test();
END;',
start_date => SYSTIMESTAMP,
enabled => true,
repeat_interval => 'FREQ=DAILY');
END;
Run Code Online (Sandbox Code Playgroud)

我可以像CALL emp_test()不使用工作一样调用过程。

当我在上面的作业中使用相同的东西时,作业已成功创建,但程序未运行,未插入行。我需要运行这个作业并且应该插入行;有人可以帮我吗?

oracle stored-procedures oracle-11g-r2 plsql jobs

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

如何在 Oracle db 中的同一个 `Instead Of` 触发器中组合插入、更新和删除?

创建Instead Of触发器时,Sql Developer 允许在同一个触发器中包含所有 3 个 DML 操作:

在此处输入图片说明

结果 SQL 如下所示:

CREATE OR REPLACE TRIGGER TRIGGER1 
INSTEAD OF DELETE OR INSERT OR UPDATE ON PO_COSTED_BOM_V 
BEGIN
  NULL;
END;
Run Code Online (Sandbox Code Playgroud)

我能够结合InsertUpdate喜欢这样的:

CREATE OR REPLACE TRIGGER TRIGGER1 
INSTEAD OF INSERT OR UPDATE OR DELETE ON PO_COSTED_BOM_V 
BEGIN
  UPDATE SRC_TBL SET CFG_VALUE = :NEW.CFG_VALUE
  WHERE CFG_NAME = :NEW.CFG_NAME;
  IF SQL%NOTFOUND THEN
      INSERT INTO SRC_TBL (CFG_NAME, CFG_VALUE) 
         VALUES(:NEW.CFG_NAME, :NEW.CFG_VALUE);
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)
  • 但是如何将Delete语句放入触发器中?
  • 触发器如何知道执行了哪个 DML 操作?

谢谢

trigger oracle plsql dml

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