标签: plsql

“ type”和“ subtype”关键字有什么区别?

在某些PL / SQL示例代码中,我每次都使用type和subtype关键字来声明自定义类型(typedef例如,类似于C中的关键字)。

在我看来,它们的用法是可以互换的:它们有什么区别?

oracle plsql

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

Oracle中的日期转换(YYYYMMDD格式返回YYYYMMDD)

嗨,我对Oracle很陌生,需要了解如何做到这一点.

我认为我有一个文本文件,文件中的值是

'20180924''20180923'

我从Pro*c读取这些值,然后我添加29天,所以现在值从20180924变为20180953.我不希望发生这种情况我希望将值添加为

 TO_DATE('20180924','yyyymmdd')+29 which returns the value as "23-OCT-18" 
Run Code Online (Sandbox Code Playgroud)

答案是正确的,但我希望结果也像20181023一样采用相同的YYYYMMDD格式.

我如何实现这一目标?

oracle plsql

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

Oracle pl/sql ORA-00904无效标识符

我是pl/sql的新手,我无法弄清楚以下脚本中的问题是什么.首先我执行了这个脚本:

CREATE TABLE Cladiri (
 id_cladire varchar2(5) constraint pk_cladire primary key,
 denumire_cladire varchar2(50),
 numar_cladire number(2),
 adresa varchar2(50),
 cod_postal varchar2(15)
);
Run Code Online (Sandbox Code Playgroud)

哪个成功创建了一个表.接下来,我想创建一个带有外键引用的新表id_cladire:

CREATE TABLE Companii (
    id_companie varchar2(5) constraint pk_companie primary key,
    denumire_companie varchar2(50),
    numar_cladire number(4),
    numarul_de_telefon varchar2(20),
    numarul_de_oficii number(4),
    constraint fk_companie_cladire foreign key (id_cladire) references 
Cladiri(id_cladire)
);
Run Code Online (Sandbox Code Playgroud)

执行最后一个脚本时出现以下错误:

ORA-00904:"ID_CLADIRE":标识符无效

问题是什么?

oracle plsql

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

当EXISTS(SELECT ...)似乎总是返回true时的情况

我需要测试表是否存在.如果它存在,我需要获取该表的rowcount,否则我需要将rowcount值设置为NULL.

这是我使用的查询的片段:

SELECT 
    CASE 
    -- TABLE A does not exists
        WHEN EXISTS (Select TABLE_NAME from ALL_TABLES where TABLE_NAME ='A') 
            THEN (SELECT COUNT(*) FROM SYS."A") 
            ELSE NULL
        END AS TABLE_count
FROM dual; 
Run Code Online (Sandbox Code Playgroud)

执行此查询时,我收到以下错误消息:

SQL Error [942] [42000]: ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)

似乎即使EXISTS返回0行,也总是执行THEN子句而不是进入ELSE子句.

我不明白这里的行为.任何的想法 ?

谢谢

sql oracle plsql

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

oracle更新日期格式掩码

我有这个程序,我需要生日字段格式为16-JUL-2018,但是当我运行程序时它以16-JUL-18格式更新.如何以想要的格式更新它?

PROCEDURE update_affiliate (pid                NUMBER,
                                   i_username         VARCHAR2,
                                   i_first_name       VARCHAR2,                              
                                   i_birthday         DATE)
       IS
       BEGIN
          UPDATE   affiliate_v
             SET   username = UPPER (i_username),
                   first_name = i_first_name,
                   birthday = TO_DATE(i_birthday,'DD-MON-YYYY'),
           WHERE   party_id = pid;

       END update_affiliate;
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

我可以在Oracle的BEGIN触发语句之后声明一个CURSOR吗?

我需要在触发器中基于以下条件在BEGIN语句之后创建一个CURSOR:

IF :OLD.DWF_STATUS = 'P' AND :NEW.DWF_STATUS = 'C' THEN

    DECLARE CURSOR cur_list IS
        SELECT DISTINCT DR_PRJ_ID, STR_EMAIL, DWFU_US_ID
        FROM DOC_WORKFLOW JOIN DOC_WF_USERS ON DWFU_DWF_ID = DWF_ID
        JOIN DOCUMENT_REF ON DWF_DR_ID = DR_ID AND DR_TYPE = 'P'
        LEFT OUTER JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
        WHERE DWF_ID = :NEW.DWF_ID;

END IF;
Run Code Online (Sandbox Code Playgroud)

当我编译时,我收到此错误:

错误(99,5):PLS-00103:遇到以下其中一项时遇到符号"END":
begin function pragma procedure子类型
当前游标删除存在之前

如何在Oracle中触发BEGIN语句后声明游标?

oracle plsql database-trigger

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

太多行投掷但只选择一行

我有这个过程,它只是根据一个被调用的列字段删除一行AppID.此过程从另一个AppNbr基于该行列调用的列获取值AppID.TOO_MANY_ROWS尝试SELECT连续时,该过程失败并出现异常.这是PL/SQL:

DECLARE
    lvnApplNbr NUMBER;

    PROCEDURE deleteAppl(applId IN VARCHAR2) IS
    BEGIN
        BEGIN
            SELECT ApplNbr -- Exception thrown here
            INTO lvnApplNbr
            FROM Appl
            WHERE ApplID = applId;
        EXCEPTION
            WHEN TOO_MANY_ROWS THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM);
        END;
        -- ... Delete it after some logic
    END; -- End Procedure
BEGIN
    ...
    deleteAppl('571E00BA-70E6-4523-BEAC-4568C3DD1A7D');
    ...
END;
Run Code Online (Sandbox Code Playgroud)

在TOO_MANY_ROWS当异常被抛出SELECT INTO秒.我不知道为什么它会抛出那个错误,因为如果我只是查询这个:

SELECT ApplNbr FROM Appl WHERE ApplId = '571E00BA-70E6-4523-BEAC-4568C3DD1A7D';
Run Code Online (Sandbox Code Playgroud)

只有一行会回来正确ApplId.

到底是怎么回事?

sql oracle plsql stored-procedures ora-01422

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

从临时表中选择时找不到数据

以下代码块有时会出现"ORA-01403:NO DATA FOUND"错误.在第一个查询中,我检索存储在另一个数据库的表中的数据,并将该数据存储到临时表中.在第二个查询中,我从临时表中选择数据INTO局部变量.我必须这样做,因为其中一个字段是CLOB,并且无法跨数据库链接选择CLOB到本地变量.

-- insert clob from remote database into temp table across database link
-- it will be deleted upon implicit commit when the report ends;
INSERT INTO  tmp_xml_result
SELECT add_id, site_cd, result_txt
FROM vw_add_result@ADifferentServer
WHERE add_id = p_add_id
    AND site = p_site;

-- now that clob is local, we can select it into a variable
SELECT xml
INTO v_xml
FROM tmp_xml_result
WHERE id = p_add_id
    AND site = p_site;
Run Code Online (Sandbox Code Playgroud)

该块并不总是错误.当它发生错误时,第二个查询将抛出NO DATA FOUND.

如何调整此代码块以使其永远不会导致"ORA-01403:NO DATA …

oracle plsql oracle11g

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

使用CTE函数插入语句

我正在尝试这样做:

with
  function add_fnc(p_id number) return number
  is
  begin
    return p_id + 1; 
  end;
insert into temp_table
(
select add_fnc(1) from dual
);
Run Code Online (Sandbox Code Playgroud)

但它显示编译错误:

ORA-00928:缺少SELECT关键字

有没有办法使用带有insert语句的CTE函数?

sql oracle plsql

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

如何在PL/SQL中的另一个游标内读取游标

我必须完成由离开公司的人完成的开发,我试图理解在另一个游标内部构建的游标..这样的事情:

CURSOR c_fund as select col_1, 
       col_2, 
       CURSOR(select col_10 * {some formula} clo_n, 
                     col_m 
               from table2 
              where col_8 is not null)
(...)
Run Code Online (Sandbox Code Playgroud)

我怎么才能阅读内部光标?当我执行主游标的查询时,我有这个结果:

COL_1        COL_2   CURSOR
-------      ------  -------
11619187    604441  (CURSOR)
11619187    604434  (CURSOR)
11619187    604439  (CURSOR)
Run Code Online (Sandbox Code Playgroud)

当我在CURSOR数据上双击(在TOAD上)时,会弹出一个显示数据的新窗口:

CLO_N   COL_M
-----   ---------------
009511  1g0-M-TPT_BNM
009511  1g0-Q--213_BNM
009511  C--F_R*P_C:R:CT
009511  1g0-M--16_BNM
009511  P*RF_DI-TR
009511  *CR
009511  BOWLING
009511  C--F_BNM
009511  C:PIT:L
009511  N:V
009511  INF--IGN
Run Code Online (Sandbox Code Playgroud)

oracle plsql database-cursor

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