我必须创建一个 plsql 块,它将在表上添加一个新列(使用动态 Sql),然后它将在该新添加的列中插入一些数据。
当我执行块时,我收到一条消息,指出我的列未定义,即使它已在插入语句之前添加。
您知道什么可能导致此问题吗?
就像我的插入语句不知道已添加新列一样。
我执行下面的 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 新手。``
这是我对 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) 我有一个带有多个游标的存储过程。它们被定义为 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 未声明。
该变量已声明,所以我不明白该错误。
我正在尝试使用 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) 我正在尝试使用 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) 我正在使用 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)
这运行良好。为什么我会收到此错误?
我在表中有一个字符串、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 …
我在oracle apex中有一个插入查询,有时由于不同的原因(例如在数字字段中写入文本),数据没有插入。有没有办法显示错误消息来检查数据是否插入数据库?
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