我写了一个函数,看起来一切都很好,但我仍然收到错误,
以下是我的功能:
create or replace FUNCTION TRANSFERQTYBTNDATES
(
v_startDate IN DATE,
v_endDate IN DATE,
v_storeid IN NUMBER,
v_areaid IN NUMBER
)
RETURN TransferQtyBtnDates_pkg.tt_TransferQtyBtnDates_type PIPELINED
AS
v_temp SYS_REFCURSOR;
v_temp_1 TT_TRANSFERQTYBTNDATES%ROWTYPE;
BEGIN
TRUNCATE TABLE tt_TransferQtyBtnDates;
INSERT INTO tt_TransferQtyBtnDates
SELECT isb.ItemId ,
SUM(isb.Quantity) TransQty ,
isb.ExpiryDate TransExpDates
FROM Issues iss
JOIN IssuedBatches isb
ON iss.IssueRegisterId = isb.IssueRegisterId
WHERE iss.IssueType = 'TRANSFER ACCOUNT'
AND iss.IssuedDate BETWEEN v_startDate AND v_endDate
AND iss.AreaId = v_areaid
AND iss.StoreId = v_storeid
GROUP BY isb.ItemId,isb.Quantity,isb.ExpiryDate;
OPEN v_temp FOR
SELECT …Run Code Online (Sandbox Code Playgroud) 我正在做一个sql选择输出的假脱机.我有以下的SQL设置
SET FEEDBACK OFF
SET HEADING OFF
SET LINESIZE 800
SET PAGESIZE 50000
SET TRIMSPOOL ON
SET TERMOUT OFF
SET ECHO OFF
Run Code Online (Sandbox Code Playgroud)
问题是在select语句输出之前有空行插入假脱机文件.不确定我需要添加什么SQL设置.
任何人都可以告诉我为什么这不会执行?
set serveroutput on ;
Declare
TYPE type_emp IS RECORD(
emp_name employees.last_name%TYPE,
emp_salary employees.salary%TYPE);
rec_emp type_emp;
due_for_a_raise CHAR(1);
begin
SELECT last_name, salary into rec_emp
from employees
where employee_id = 150;
if emp_salary > 5000 then
due_for_a_raise := 'Y';
else
due_for_a_raise := 'N';
end if;
dbms_output.putline(last_name);
dbms_output.putline(salary);
dbms_output.putline(due_for_a_raise);
end;
Run Code Online (Sandbox Code Playgroud)
错误如下
Error report:
ORA-06550: line 11, column 6:
PLS-00201: identifier 'EMP_SALARY' must be declared
ORA-06550: line 11, column 3:
PL/SQL: Statement ignored
ORA-06550: line 16, column 23:
PLS-00201: identifier 'LAST_NAME' must be …Run Code Online (Sandbox Code Playgroud) 我在PL/SQL中创建了一个过程,它根据主键将数据从一个表插入另一个表.我的程序工作正常,但我无法弄清楚如果主键已经存在,我将如何更新我的表MAIN列CODE_NUMBER.
实际上我希望MAIN表的行在其具有主键时获得UPDATED,并在主键不存在时从REGIONS插入数据.
DECLARE
variable number;
id number;
description varchar2 (100);
CURSOR C1 IS
select regions.REGION_ID variable
from regions;
BEGIN
FOR R_C1 IN C1 LOOP
BEGIN
select regions.REGION_ID,regions.REGION_NAME
into id,description
from regions
where regions.REGION_ID = R_C1.variable;
----If exists then update otherwise insert
INSERT INTO MAIN( ID, CODE_NUMBER) VALUES( id,description);
dbms_output.put_line( id ||' '|| 'Already Exists');
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line( R_C1.variable);
END;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud) 在我的项目中,我使用oracle作为主数据库,我遇到了解析clob的问题.所以假设我们有一个有价值的clob
aaaaaa
cccccc
bbbbbb
Run Code Online (Sandbox Code Playgroud)
它存储在表格测试中......
我需要写plsql程序来获取这个clob并拆分它以便我将有三个项目的数组[aaaaaa,cccccccc,bbbbbbb].
有没有可能的解决方案?
我正在尝试将a保存CLOB到变量中以执行提取等操作.我有这个代码:
DECLARE
clob_rec CLOB;
n_rec NUMBER:=100;
BEGIN
SELECT LOB INTO clob_rec FROM table1 WHERE ID = 1234;
n_rec := clob_rec.EXTRACT('//XPTO/text()', 'xmlns:XPTO').getNumVal();
END;
Run Code Online (Sandbox Code Playgroud)
我想保存多个值,XML如各种变量n_rec.如何获得"对象实例(CLOB)"来执行函数或方法extract()?
有人能告诉我这段代码有什么问题.我的目标是编写一个传递员工姓名的程序,将员工表中的所有姓名和工资加载到VARRAY中,然后在屏幕上打印出姓名和工资.
CREATE OR REPLACE PROCEDURE VARRAY_Q2
(
PNAME IN VARCHAR2
, PSAL OUT NUMBER
) AS
--declare and create cursor
CURSOR emp_cur IS
SELECT ename,sal
FROM EMP;
TYPE varray_emp IS VARRAY(14) OF emp_Cur%ROWTYPE;
--Creating new instance of varray
x_varray_emp varray_emp := varray_emp();
v_counter NUMBER := 0;
BEGIN
x_varray_emp.EXTEND;
FOR empRecs IN emp_Cur LOOP
--Insert data into the varray
x_varray_emp(v_counter) := empRecs;
dbms_output.put_line(v_counter);
v_counter := v_counter + 1;
END LOOP;
--Loop through the varray and print out all the elements
FOR …Run Code Online (Sandbox Code Playgroud) 如何将Oracle PL/SQL包中的电子邮件发送到多个接收器?我在oracle包中有pl/sql程序,它只适用于一个接收器.我需要改进它的功能,让它可以同时向多个接收器发送电子邮件,如"To:David Festool; Peter Makita; John Dewalt".任何身体都可以帮助我,非常感谢!请提供修改后的代码.
procedure email(p_recip in varchar2,
p_subject in varchar2,
p_message in varchar2) is
c utl_smtp.connection;
msg varchar2(4000);
procedure send_header(name in varchar2, header in varchar2) as
begin
utl_smtp.write_data(c, name || ': ' || header || utl_tcp.crlf);
end;
begin
--Open SMTP connection
c := utl_smtp.open_connection('ExchangeServerName');
-- Write SMTP header
utl_smtp.helo(c, 'ExchangeServerName');
utl_smtp.mail(c, 'Email@MyCompany.on.ca');
utl_smtp.rcpt(c, p_recip);
utl_smtp.open_data(c);
send_header('From', '"Title" <Email@MyCompany.on.ca');
send_header('To', p_recip);
send_header('Subject', p_subject);
send_header('Mime-Version', '1.0');
send_header('Content-Type', 'multipart/mixed; boundary="DMW.Boundary.605592468"');
-- Write MIME boundary line for the message body …Run Code Online (Sandbox Code Playgroud) 所以我触发如下
create or replace TRIGGER TWELVE_ONE
BEFORE INSERT OR UPDATE OR DELETE
ON ORDERS
FOR EACH ROW
DECLARE
V_DAY VARCHAR2 (10);
MyException exception;
BEGIN
SELECT TO_CHAR (SYSDATE, 'DAY') INTO V_DAY FROM DUAL;
DBMS_OUTPUT.PUT_LINE(V_DAY);
IF (V_DAY='SUNDAY')
THEN
raise_application_error(-20001, 'Today is Sunday. Order table cannot be altered');
end if;
END;
Run Code Online (Sandbox Code Playgroud)
这应该防止UPDATE,INSERT并且DELETE如果系统一天SUNDAY.从逻辑上讲,它似乎是正确的,但不幸的是它仍然允许插入.我在这做错了什么?我正在使用SQL Developer请帮助非常感谢
我想知道我们是否有任何技术可以计算出需要为批量收集操作的LIMIT子句设置的值.例如下面,假设我们的光标有1000万条记录.我们可以为LIMIT子句设置的值是什么,以获得最佳性能.我们有什么方法可以计算它.
decalre
cursor c_emp is <some select query>
var <variable> ;
begin
open c_emp;
loop
fetch c_emp bulk collect into var limit 2;
exit when c_emp%NOTFOUND;
end loop;
close c_emp;
end;
Run Code Online (Sandbox Code Playgroud) plsqldeveloper ×10
oracle ×8
plsql ×8
oracle11g ×4
sql ×3
oracle10g ×2
database ×1
oracle11gr2 ×1