标签: plsql

立即执行以添加列并在此新列中插入数据

我必须创建一个 plsql 块,它将在表上添加一个新列(使用动态 Sql),然后它将在该新添加的列中插入一些数据。

当我执行块时,我收到一条消息,指出我的列未定义,即使它已在插入语句之前添加。

您知道什么可能导致此问题吗?

就像我的插入语句不知道已添加新列一样。

sql oracle plsql insert dynamic

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

PLS-00103:遇到符号“INSERT”

我执行下面的 PLSQL 查询。

SET SERVEROUT ON;
Create or Replace Trigger bi_Shippers
Before INSERT on Shippers
For EACH ROW
ENABLE
DECLARE
v_User VARCHAR2(20);
BEGIN
SELECT user INTO v_User from Dual;
DBMS_OUTPUT.PUT_LINE('You Just inserted a Line'||v_User);
END;

INSERT into shippers(shipperid) VALUES(5);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误。触发器 BI_SHIPPERS 已编译

线条/颜色错误


8/1 PLS-00103:遇到符号“INSERT”错误:检查编译器日志

请帮忙解决这个问题,因为我是 PLSQL 新手。``

plsql

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

Oracle pl/sql 更新表的过程 - 异常处理

这是我对 PL/SQL 的第一次查询,我确实花了一个小时试图在网上寻找答案,无论如何 - 就这样。

我正在编写一个更新表的过程,一切正常,但是当我输入更新job_id不存在的表时,我希望异常处理告诉我该表job_id无效,但是我没有收到错误消息。

我的代码如下:

CREATE OR REPLACE PROCEDURE UPD_JOB(p_job_id jobs.job_id%TYPE, p_jobnew jobs.job_title%TYPE)
IS
BEGIN
UPDATE JOBS SET job_title =p_jobnew WHERE JOB_ID = p_job_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No rows have been updated');
END;
/
Run Code Online (Sandbox Code Playgroud)

然后,我尝试更新一个我知道不存在的 job_id,通过输入以下内容来查看异常是否有效

EXECUTE UPD_JOB('ABCXXX','WILL FAIL');
Run Code Online (Sandbox Code Playgroud)

oracle plsql exception

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

如何使用 SQL Developer 显示引用游标的结果

我有一个带有多个游标的存储过程。它们被定义为 IN OUT 参数。我想使用 SQL Developer 显示游标的结果。这是存储过程的示例:

SET serveroutput on;
DECLARE
         p_input_stream       VARCHAR2(200);
        p_msg_code            NUMBER;
         p_msg_parms                         VARCHAR2(200);
         p_return_code                       NUMBER;
         p_trailer_cur                    sl_globals.curtype_weak;

 BEGIN
    /* Assign values to IN parameters */
    p_input_stream := '24954286Mnull|5155035|2|436|SCAN|47720|XTRA|0105||5155035||||N|~|\r';
    p_trailer_cur := null;

EXEC TRAILER_INFO(p_input_stream, 
        p_msg_code, p_msg_parms, p_return_code, 
        p_trailer_cur)

 /* Display OUT parameters */
    dbms_output.put_line('p_msg_code: ' || p_msg_code);
    dbms_output.put_line('p_msg_parms: ' || p_msg_parms);
    dbms_output.put_line('p_return_code: ' || p_return_code);
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个 refcursor 变量并使用它来代替p_trailer_cur这样

VARIABLE trailer_cur refcursor;
 EXEC TRAILER_INFO(p_input_stream, 
        p_msg_code, p_msg_parms, p_return_code, 
        :trailer_cur)
 print trailer_cur;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

SP2-0552:绑定变量“trailer_cur 未声明。

该变量已声明,所以我不明白该错误。

plsql oracle-sqldeveloper

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

如何修复存储过程中 OUT 变量中的字符串缓冲区太小错误

我正在尝试使用 OUT 变量发送 SQL 结果,但收到“ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小”错误,我尝试将 o_sql 从 varchar2 更改为 nvarchar2 但仍然有一个问题,而且似乎也无法在输入/输出部分将其定义为 varchar2(10000) 。在第一部分中,我从 i_In 和 o_sql + o_file 收到了过程调用者的时间,我还删除了异常部分 bcz 没有任何问题。

CREATE OR REPLACE PROCEDURE P_C_CCT_QADATA(i_In      in  varchar2,
    o_sql     out nvarchar2,  --in here i try to change it to varchar2(1000) 
    --but not working and 
    o_File    out varchar2
    )
AS
v_date        DATE;
v_ERRCODE     T_C_CCT_RESULTMSG.code%TYPE;
v_ERRMSG      T_C_CCT_RESULTMSG.MESSAGE%TYPE;
v_month       varchar(2);

Begin

v_date := TO_DATE(i_In,'YYYYMMDDHH24MISS');
select to_char(sysdate, 'MM') into v_month from dual;


o_sql  := 'select t.SERIALNO,
t.CONTACTID,
t.CONTACTCHANNELID,
t.CONTACTCHANNELNAME,
t.CONTACTMODEID,
t.CONTACTMODENAME,
t.SUBCCNO,
t.VDNID,
t.HOSTEDCCID, …
Run Code Online (Sandbox Code Playgroud)

oracle plsql stored-procedures procedure

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

JPA 实体的 Oracle OUT SYS_REFCURSOR 始终为空

我正在尝试使用 PLSQL 存储过程获取行,并将它们保存到 JPA 实体中。我正在使用ojbdc7,spring-boot-starter-data-jpa和spring-boot 2.2.1.

这是我的程序:

create or replace PACKAGE BODY pkg_test
AS
    PROCEDURE getAll(res OUT SYS_REFCURSOR)
    IS 
    BEGIN
        OPEN res FOR SELECT * FROM employee;
    END getAll;

END pkg_test;
Run Code Online (Sandbox Code Playgroud)

我的实体是:

package com.stefanocapra.plsql.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.StoredProcedureParameter;

import antlr.collections.List;

@Entity
@NamedStoredProcedureQueries({
    @NamedStoredProcedureQuery(
            name = "getAll",
            procedureName = "pkg_test.getAll",
            resultClasses = Employee.class,
            parameters = { 
                    @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class)
            })
})
public …
Run Code Online (Sandbox Code Playgroud)

java spring plsql stored-procedures

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

收到错误:“ORA-20999:无法解析 SQL 查询!<p>ORA-06550:第 3 行,第 25 列:ORA-00936:缺少表达式

我正在使用 Oracle Apex 并根据从 plsql 正文返回 sql 创建报告。

我的声明是这样的:

DECLARE
    l_query varchar2(1000); 
BEGIN
   l_query := 'SELECT ' || :P10_MYVAR || ' from dual ';
   return l_query;
END;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

ORA-20999: Parsing returned query results in "ORA-20999: Failed to parse SQL query! <p>ORA-06550: line 3, column 25: ORA-00936: missing expression</p>".
Run Code Online (Sandbox Code Playgroud)

如果我尝试不使用任何绑定变量,它可以正常编译:

DECLARE
        l_query varchar2(1000); 
    BEGIN
       l_query := 'SELECT sysdate from dual ';
       return l_query;
    END;
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会发生这个错误。如果我直接在数据库中运行命令:

SELECT :P10_MYVAR from dual
Run Code Online (Sandbox Code Playgroud)

这运行良好。为什么我会收到此错误?

sql oracle select plsql oracle-apex

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

通过 pl/sql 过程将带有行间隙和空值的逗号分隔值拆分到表中的列中

我在表中有一个字符串、clob 值,我需要将其拆分为列。源表查询:

Insert into disp_data(id,data) values(100,
'"Project title as per the outstanding Requirements","The values are not with respect to the requirement and analysis done by the team. 
Also it is difficult to prepare a scenario notwithstanding the fact it is difficult. This user story is going to be slightly complex however it is up to the team","Active","Disabled","25 tonnes of fuel","www.examplesites.com/html.asp&net;","","","","","25"');
Run Code Online (Sandbox Code Playgroud)

在 clob 列值中也存在空格、空值和行间隙。所以当我尝试使用分割它时

select regexp_substr(data,'[^,]+',1,level) from disp_data 
connect by regexp_substr(data,'[^,]+',1,level) is not null.
Run Code Online (Sandbox Code Playgroud)

问题是对于有行间隙的大文本,它会将其分成不同的行。我曾想过使用上面的结果集和数据透视表,但无法做到。

我需要将此数据作为列获取并推入目标表-push_data_temp。

select pid,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11 from push_data_temp;
Run Code Online (Sandbox Code Playgroud)

clob …

sql oracle plsql regexp-substr

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

数据未插入oracle apex时出现错误消息

我在oracle apex中有一个插入查询,有时由于不同的原因(例如在数字字段中写入文本),数据没有插入。有没有办法显示错误消息来检查数据是否插入数据库?

javascript oracle plsql oracle-apex apex

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

为什么我在这个动态查询中需要关键字 TABLE,尽管在普通查询中不需要

db fiddle 现在不工作。稍后我会上传代码...

SELECT COUNT (*) FROM sys.odcivarchar2list ('2', '2');
Run Code Online (Sandbox Code Playgroud)

该查询无需使用关键字表即可工作。但在动态查询中:

DECLARE
    c             INTEGER;
    towtimestwo   SYS.odcivarchar2list := sys.odcivarchar2list ('2', '2');
BEGIN
    
     EXECUTE IMMEDIATE 'SELECT COUNT (*) FROM  :1'
        INTO c
        USING towtimestwo;
    DBMS_OUTPUT.put_line (c);

END;
Run Code Online (Sandbox Code Playgroud)

它不起作用:

无效的表名

因此我必须添加关键字。

DECLARE
    c             INTEGER;
    towtimestwo   SYS.odcivarchar2list := sys.odcivarchar2list ('2', '2');
BEGIN
    
     EXECUTE IMMEDIATE 'SELECT COUNT (*) FROM  table( :1)'
        INTO c
        USING towtimestwo;
    DBMS_OUTPUT.put_line (c);

END;
Run Code Online (Sandbox Code Playgroud)

为什么?

我正在使用 Oracle 19.0

oracle plsql

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