以下PL/SQL块有效:
DECLARE
r TABLE1%ROWTYPE;
BEGIN
SELECT * INTO r FROM TABLE1 SAMPLE(1) WHERE ROWNUM = 1;
END;
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试用SAMPLE子句中的变量替换文字时,Oracle会返回语法错误:
DECLARE
s NUMBER;
r TABLE1%ROWTYPE;
BEGIN
s := 1;
SELECT * INTO r FROM TABLE1 SAMPLE(s) WHERE ROWNUM = 1;
END;
ORA-06550: line 6, column 39:
PL/SQL: ORA-00933: SQL command not properly ended
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我正在使用Oracle 10和SQL Developer.
(这些是简化的例子.我实际上在实践中尝试做的是优化随机行的选择,其中SAMPLE百分比将根据表中的当前行数动态计算.所以我不能使用文字,我需要一个变量来分配计算结果.)
我有一个创建和声明不同类型的过程.但每次我写'创建类型'或'声明类型'我都会收到此错误:
ERROR第4行,第10栏,结尾第4行,结尾_col 18,找到'收件人',期待:(.@或%或..:= DEFAULT NOT NULL或;
我使用的是Oracle 10,这些是程序的第一行.错误
CREATE OR REPLACE PROCEDURE ACTIVITE_PROD.NOTIF_NEW_HOLIDAY(v_USER_ID INTEGER, v_DURATION NUMBER, v_WEEK INTEGER, v_YEAR INTEGER) IS
-- this line causes the error
create type recipient as object (firstname varchar2, lastname varchar2, email varchar2);
-- this line also causes an error if modified and set first
declare
type recipients_list is table of recipient;
admins recipients_list := recipients_list();
Run Code Online (Sandbox Code Playgroud)
我的代码出了什么问题?
如何查询批量收藏?如果我有
select name
bulk collect into namesValues
from table1
Run Code Online (Sandbox Code Playgroud)
其中namesValues是dbms_sql.varchar2_table.
现在,我有另一个包含XYZ的表格
name is_valid
v
h
Run Code Online (Sandbox Code Playgroud)
如果name在table1中,则我想将is_valid更新为'Y',否则为'N'.表1有1000万行.批量收集后我想执行
update xyz
set is_valid ='Y'
where name in namesValue.
Run Code Online (Sandbox Code Playgroud)
如何查询namesValue?或者还有另一种选择.表1没有索引.请帮忙.
我目前正在使用这段代码从我的函数中返回一组行.
--Source: http://www.adp-gmbh.ch/ora/plsql/coll/return_table.html
create or replace type t_col as object (
i number,
n varchar2(30)
);
/
create or replace type t_nested_table as table of t_col;
/
create or replace function return_table return t_nested_table as
v_ret t_nested_table;
begin
v_ret := t_nested_table();
v_ret.extend;
v_ret(v_ret.count) := t_col(1, 'one');
v_ret.extend;
v_ret(v_ret.count) := t_col(2, 'two');
v_ret.extend;
v_ret(v_ret.count) := t_col(3, 'three');
return v_ret;
end return_table;
/
Run Code Online (Sandbox Code Playgroud)
我通过发出SQL来调用它
select * from table(return_table);
Run Code Online (Sandbox Code Playgroud)
无法在包中定义对象类型,我尝试使用有效的记录类型(在PL/SQL中),但我无法以与此相同的方式从中进行选择.
如何使用包内的函数实现此结果?
所以我遇到的问题是,如果我执行以下过程并且游标没有找到传递的参数,它继续执行块(插入语句)但不抛出NO_DATA_FOUND异常错误它会抛出父/外键错误.
CREATE OR REPLACE PACKAGE ASSIGNMENT3 IS
PROCEDURE END_CAMPAIGN(CTITLE IN CAMPAIGN.CAMPAIGNTITLE%TYPE);
END ASSIGNMENT3;
/
CREATE OR REPLACE PACKAGE BODY ASSIGNMENT3 AS
PROCEDURE END_CAMPAIGN(CTITLE IN CAMPAIGN.CAMPAIGNTITLE%TYPE) IS
CURSOR ADCOST_CUR IS
SELECT ACTUALCOST
FROM ADVERTISEMENT
WHERE ADVERTISEMENT.CAMPAIGNTITLE = CTITLE;
V_TOTALCOST NUMBER;
BEGIN
V_TOTALCOST := 0;
FOR INVOICE_REC IN ADCOST_CUR
LOOP
V_TOTALCOST := V_TOTALCOST + INVOICE_REC.ACTUALCOST;
END LOOP;
INSERT INTO INVOICE(INVOICENO, CAMPAIGNTITLE, DATEISSUED, DATEPAID, BALANCEOWING, STATUS)
VALUES (AUTOINCREMENTINVOICE.nextval, CTITLE, SYSDATE, NULL,V_TOTALCOST,NULL);
EXCEPTION WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('ERROR:The campaign title you entered returned no record(s), …Run Code Online (Sandbox Code Playgroud) 嗨,我正在插入一些日期做我的表.由于某些原因,我不得不禁用我的约束.约束与索引相关联.我用过这行代码:
ALTER TABLE my_table DISABLE CONSTRAINT "my_constraint" drop index
Run Code Online (Sandbox Code Playgroud)
并且my_constraint处于禁用状态.不,我想启用此约束,但在调用此行之后:
ALTER TABLE my_table ENABLE NOVALIDATE CONSTRAINT "my_constraint";\
Run Code Online (Sandbox Code Playgroud)
我发现了一个错误:
ORA-02299:无法验证(USER.my_constraint) - - 找到重复的密钥
是否有更简单的方法可以从PL/SQL程序(Oracle 10G)中关闭所有打开的游标.
我有一个程序,可以生成许多例外.要正确退出,我需要检查是否有任何游标打开并关闭它们.这就是我最终会遇到的那种情况.
Procedure test
is
--
---
Begin
--
--
Exception
when no_data_found then
if cursorA%isopen close
if cursorB%isopen close
if cursorC%isopen close
when invalid_date then
if cursorA%isopen close
if cursorB%isopen close
if cursorC%isopen close
when invalid_user then
if cursorA%isopen close
if cursorB%isopen close
if cursorC%isopen close
when others then
if cursorA%isopen close
if cursorB%isopen close
if cursorC%isopen close
End test;
Run Code Online (Sandbox Code Playgroud)
显然,如果有许多例外条款,上述情况并不理想.而不是对每个异常块进行相同的检查,是否有更快的方法来关闭所有打开的游标?注意:它只需要关闭当前运行的pl/sql程序打开的游标,因为可能还有其他pl/sql程序也可以打开游标.
提前致谢
我有触发器的问题.创建触发器后,它会给我消息
BD1.UTILIZADOR处于变异状态,触发器无法读取或执行
我有这张桌子
create table UTILIZADOR
(
U_ID NUMBER(6) not null,
U_NOME VARCHAR2(60) not null,
U_SEXO VARCHAR2(10) not null,
U_IDADE NUMBER(3) not null,
U_ALTURA NUMBER(3) not null,
U_PESO NUMBER(6) not null,
U_IMC NUMBER(2,2),
U_PRIVILEGIOS NUMBER(1) not null,
U_PASSWORD VARCHAR2(10) not null,
constraint PK_UTILIZADOR primary key (U_ID)
);
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
INSERT INTO UTILIZADOR (U_ID,U_NOME,U_SEXO,U_IDADE,U_ALTURA,U_PESO,U_PRIVILEGIOS,U_PASSWORD) VALUES (1,'my name','Male',32,174,74000,0,'password');
Run Code Online (Sandbox Code Playgroud)
然后
SELECT * FROM UTILIZADOR;
Run Code Online (Sandbox Code Playgroud)
我可以看到一切都如预期的那样.
我想做的是,当插入或更新U_ALTURA或U_PESO时,字段U_IMC会自动更新/插入.
这是如果完成的:
CREATE OR REPLACE TRIGGER CALCULA_IMC
AFTER INSERT OR UPDATE OF U_ALTURA, U_PESO ON UTILIZADOR
FOR EACH ROW …Run Code Online (Sandbox Code Playgroud) 我在表中有一列,其中包含带有附加字符串的特殊字符.同一列也包含数字.我只是在提取该列中的数字时感到沮丧,例如
Name-3445 => 3445; Out-90 => 90; 786 => 786
Run Code Online (Sandbox Code Playgroud)
我如何在SQL或PL/SQL中执行此操作?
我使用以下代码在Oracle中创建了一个虚拟列.
CREATE OR REPLACE function email_address (ID_ varchar2)
return varchar2
deterministic
as
lname varchar2 (256);
snumber varchar2 (256);
email varchar2 (256);
BEGIN
select substr( p.name, instr( p.name, ' ', -1 ) + 1 ) into lname
from person p where p.id = id_;
SELECT regexp_replace(p.service_no, '[^0-9]*', '') into snumber
FROM person p where p.ID = id_;
email:= snumber||lname||'@met.af';
return email;
end email_address;
Run Code Online (Sandbox Code Playgroud)
虚拟列工作正常,它确实填充了我想在虚拟列中实现的内容.但是当我使用虚拟列表创建视图时会出现问题; 表现非常糟糕(观点的人口).在这里,我想提一下,如果我不使用该功能(即电子邮件的空列),该视图的工作完全正常.视图的代码如下
select distinct
person.SERVICE_NO as Service_No,
person.CNIC_NO as CNIC, person.NAME as NAME ,
card.CPLC_SERIAL_NO as Card_Number,
child_dc.NAME …Run Code Online (Sandbox Code Playgroud)