我正在阅读Oracle 概念文档并有疑问 [关于一般缓存机制]:
PL/SQL 函数代码可以包括缓存其结果的请求。调用此函数时,系统会检查缓存。如果缓存包含具有相同参数值的先前函数调用的结果,则系统将缓存的结果返回给调用者并且不重新执行函数体。如果缓存中不包含结果,则系统执行函数体并将结果(对于这些参数值)添加到缓存中,然后再将控制权返回给调用者
我的疑问:
执行 PL/SQL 函数后,其结果集存储在缓存中。然后 DDL 语句更改表/索引/函数使用的任何内容...
如果我现在运行相同的 PL/SQL 函数,我会得到相同的结果还是更新的结果?
我有一个 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变量一次?
我正在尝试从备份表中恢复一个分区。两个表都有同名的分区。我的目标是从备份表分区 x 中抓取数据并将其放入原始表分区 x。x 是分区的名称。
我试图通过使用辅助表来做到这一点。有没有办法直接交换它们或任何其他性能更好的解决方案?
performance oracle oracle-11g-r2 plsql partitioning performance-tuning
我必须选择传递给光标的给定字符串(用逗号分隔的值)。可以有多个值可以通过单个变量传递。我的代码有点像:
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)
如何传递该变量正确性?任何帮助,将不胜感激。
我需要将来自客户和公司的地址存储到具有相同列的不同表中。我想知道使用相同的插入语句的最佳方法是什么,但只能通过更改表的名称。
例子:
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) insert从表中的每个条目生成语句的最简单方法是什么?对于 3 行的表,我需要生成 3 个插入语句。
对于具有n行的表,我需要写入文件n insert语句。
例如,对于 row (foo, bar, baz) 我需要将语句写入该文件:
insert into desired_table values (foo, bar, baz)
Run Code Online (Sandbox Code Playgroud) 这些是我创建并插入了一些值的表:
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) 嗨,当我执行假脱机文件时,我试图在异常语句中执行 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 调度程序作业中调用存储过程。我的程序和工作如下所示:
存储过程
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()不使用工作一样调用过程。
当我在上面的作业中使用相同的东西时,作业已成功创建,但程序未运行,未插入行。我需要运行这个作业并且应该插入行;有人可以帮我吗?
创建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)
我能够结合Insert并Update喜欢这样的:
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语句放入触发器中?谢谢
oracle ×10
plsql ×10
cache ×1
cursors ×1
dml ×1
functions ×1
jobs ×1
partitioning ×1
performance ×1
trigger ×1