标签: plsql

Oracle PL/SQL:在SAMPLE子句中使用变量时出现语法错误

以下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百分比将根据表中的当前行数动态计算.所以我不能使用文字,我需要一个变量来分配计算结果.)

oracle plsql oracle10g

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

这个错误意味着什么,为什么会出现?

我有一个创建和声明不同类型的过程.但每次我写'创建类型'或'声明类型'我都会收到此错误:

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)

我的代码出了什么问题?

sql oracle plsql

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

在Oracle中批量收集

如何查询批量收藏?如果我有

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没有索引.请帮忙.

oracle plsql oracle11g

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

从打包函数返回集合以供select使用

我目前正在使用这段代码从我的函数中返回一组行.

--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中),但我无法以与此相同的方式从中进行选择.

如何使用包内的函数实现此结果?

oracle plsql

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

为什么没有触发异常NO_DATA_FOUND?

所以我遇到的问题是,如果我执行以下过程并且游标没有找到传递的参数,它继续执行块(插入语句)但不抛出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)

sql oracle plsql

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

使用novalidate选项无法验证

嗨,我正在插入一些日期做我的表.由于某些原因,我不得不禁用我的约束.约束与索引相关联.我用过这行代码:

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) - - 找到重复的密钥

sql oracle plsql

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

从pl/sql异常块关闭所有游标'once'

是否有更简单的方法可以从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程序也可以打开游标.

提前致谢

sql oracle plsql oracle10g

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

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)

oracle triggers plsql

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

删除特殊字符SQL

我在表中有一列,其中包含带有附加字符串的特殊字符.同一列也包含数字.我只是在提取该列中的数字时感到沮丧,例如

Name-3445 => 3445; Out-90 => 90; 786  => 786
Run Code Online (Sandbox Code Playgroud)

我如何在SQL或PL/SQL中执行此操作?

sql oracle plsql

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

虚拟列 - 在视图中使用它(Oracle)

我使用以下代码在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)

sql oracle plsql function oracle11g

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

标签 统计

oracle ×10

plsql ×10

sql ×6

oracle10g ×2

oracle11g ×2

function ×1

triggers ×1