尝试使用对象表的BULK COLLECT语句时出错ORA-00947: not enough values。
线路发生错误 from (select jta.nobject_id,
CREATE OR REPLACE TYPE "T_PPW_WORK" as object
(
nObjectKey number,
cJobType varchar2(500),
dPlanStart date,
dPlanEnd date,
cExecutor varchar2(500),
cComment varchar2(4000)
)
CREATE OR REPLACE TYPE "T_PPW_WORK_TABLE" as table of T_PPW_WORK;
function getPlannedOverdueJobs(in_nPlanKey number) return T_PPW_WORK_TABLE is
l_oWorks T_PPW_WORK_TABLE;
l_oWork T_PPW_WORK;
begin
select * bulk collect
into l_oWorks
from (select jta.nobject_id,
jt.cjobtype_name,
jta.dactual_start,
jta.dactual_finish,
st.familiya,
jta.ccomment
from ppw_jobtype_assign jta
left join pgts_sotrudnik st
on jta.nworkerid = st.npgts_sotrudnikkey
join …Run Code Online (Sandbox Code Playgroud) 我有一个包(可能很多),我想将其复制到具有不同名称的新包中。
理想情况下,我想运行这个:
begin
copy_package('MY_PACKAGE_NAME','MY_PACKAGE_NAME$BK');
end;
/
Run Code Online (Sandbox Code Playgroud)
这将找到名为 的包MY_PACKAGE_NAME,并创建/替换一个名为 的新包,MY_PACKAGE_NAME$BK其中所有引用MY_PACKAGE_NAME(如果有)也已更改。
假设包名称不区分大小写是合理的,并且源中对包名称的任何引用都将全部为大写或全部小写(即My_Package_Name源中不会有任何引用)。
我正在处理一个现有的包,我发现了一个这样的功能;
FUNCTION get_lang
RETURN VARCHAR2
AS
l_ret_lang VARCHAR2 (10);
BEGIN
SELECT 'US' LANGUAGE
INTO l_ret_lang
FROM DUAL;
RETURN l_ret_lang;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_ret_lang := ' ';
RETURN l_ret_lang;
WHEN OTHERS
THEN
l_ret_lang := SUBSTR (SQLERRM, 1, 100);
RETURN l_ret_lang;
END;
Run Code Online (Sandbox Code Playgroud)
定义这样的函数是否有任何合乎逻辑的理由,定义如下更简单的版本不是更好吗?
FUNCTION get_lang
RETURN VARCHAR2
AS
l_ret_lang VARCHAR2 (10):= 'US';
BEGIN
RETURN l_ret_lang;
END;
Run Code Online (Sandbox Code Playgroud)
还从双表达式中选择可以引发异常吗?
我用 3 个程序创建了以下包:
CREATE OR REPLACE PACKAGE PQ_PaqueteIntegrantes
AS
PROCEDURE INTEG_INSERCIONES(paIdIntegrante IN CreadorTablas.INTEGRANTES.ID_INTEGRANTE%TYPE
,paNombre IN CreadorTablas.INTEGRANTES.NOMBRE%TYPE
,paApellidoPaterno IN CreadorTablas.INTEGRANTES.APELLIDO_PATERNO%TYPE);
PROCEDURE INTEG_MODIFICACIONES(paIdIntegrante IN OUT CreadorTablas.INTEGRANTES.ID_INTEGRANTE%TYPE
,paNombre IN OUT CreadorTablas.INTEGRANTES.NOMBRE%TYPE
,paApellidoPaterno IN OUT CreadorTablas.INTEGRANTES.APELLIDO_PATERNO%TYPE);
PROCEDURE INTEG_ELIMINCACIONES(
paIdIntegrante IN OE.EJEMPLO_TRANSAC_CLASE.CUSTOMER_ID%TYPE
,paMjeDescError OUT VARCHAR2
,paCodeError OUT NUMBER);
END PQ_PaqueteIntegrantes;
Run Code Online (Sandbox Code Playgroud)
我使用名为Admin_proyectos的用户创建了这些过程。第一个过程制作“插入”,第二个“更新”,最后一个“删除”,所有这些都在一个名为Integrantes的表上工作,该表来自另一个名为CreadorTablas 的用户。我的目的是创建另一个名为Admin 的用户,当然,他将负责使用这个包中的过程来做这些事情。我试过做一个 PL/SQL 块,但它不起作用,无论是 EXEC。
我编写了以下 oracle 程序来批量获取数据并分块处理。我正在使用有限制的批量收集选项来获取数据。但是在 for 循环中,我无法检索 ORD_ID。我正在尝试使用输出 ORD_ID
DBMS_OUTPUT.put_line(l_orders(indx));
Run Code Online (Sandbox Code Playgroud)
但是出现编译错误“调用'PUT_LINE'的参数数量或类型错误”
create or replace PROCEDURE TESTPROC AS
CURSOR order_id_cur IS SELECT ORD_ID FROM orders ORDER BY ORD_ID ASC;
l_order_id VARCHAR2(100);
TYPE orders_aat IS TABLE OF order_id_cur%ROWTYPE;
l_orders orders_aat;
limit_in NUMBER :=10;
batch_in NUMBER :=0;
BEGIN
OPEN order_id_cur;
LOOP
FETCH order_id_cur
BULK COLLECT INTO l_orders LIMIT limit_in;
DBMS_OUTPUT.put_line('Batch-----'||batch_in);
FOR indx IN 1 .. l_orders.COUNT
LOOP
DBMS_OUTPUT.put_line(indx);
DBMS_OUTPUT.put_line(l_orders(indx));
END LOOP;
EXIT WHEN l_orders.COUNT < limit_in;
batch_in := batch_in+1;
END LOOP;
CLOSE order_id_cur;
END TESTPROC; …Run Code Online (Sandbox Code Playgroud) 嗨,我正在尝试从我的 Shell 脚本执行 PL SQL 过程并获取返回值(输出值),但它不起作用。谁能建议我做错了什么?这是我所拥有的:
output="$(sqlplus -S user/pw@//ip:1521/db <<ENDOFSQL
set serveroutput on;
DECLARE
v_return PLS_INTEGER;
BEGIN
PKG.Procedure(v_return);
DBMS_OUTPUT.PUT_LINE(v_return);
END;
exit;
ENDOFSQL)"
echo $output
Run Code Online (Sandbox Code Playgroud) 我有接下来的 3 个表:
我必须用斐波那契表中的质数填充 FiboPrime 表(质数=1 => 数字是质数,否则数字不是质数。)
我必须使用 MERGE 语句,它是尝试:
DECLARE
BEGING
MERGE INTO FiboPrime fp
USING fibonacci f, prime p
ON (f.value=p.value)
WHEN MATCHED THEN
UPDATE SET
fp.value=f.value,
fp.prime=1;
WHEN NOT MATCHED THEN
INSERT VALUES(f.value,0);
END;
Run Code Online (Sandbox Code Playgroud)
我收到下一个错误:当期望出现以下情况之一时,出现符号“INTO”: := .( @ ; not null range character。谁能帮我解决这个问题?
对于 PL-SQL 人员来说,这应该很容易选择。在将此问题标记为重复之前,请确保虽然错误消息可能很常见,但潜在问题与上一个问题相同。如果是这样,请提供指向已解决的确切逻辑重复问题的链接。一世
当我登录到我的模式时,我执行以下 PL-SQL 代码:
DECLARE
v_rpt_per_key NUMBER := 0;
BEGIN
SELECT MAX(rpt_per_key)
INTO v_rpt_per_key
FROM rxfinods_sta.hd_invc_ln_item_dtl_stat;
dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);
END;
/
Run Code Online (Sandbox Code Playgroud)
查询成功执行,最大值RPT_PER_KEY写入 Toad 中的输出窗口。
但是,当我在一个过程中执行基本相同的代码时。
CREATE OR REPLACE PROCEDURE hd_purge_test
IS
v_rpt_per_key NUMBER := 0;
BEGIN
SELECT MAX(stat.rpt_per_key)
INTO v_rpt_per_key
FROM rxfinods_sta.hd_invc_ln_item_dtl_stat stat;
--HD_INVC_LN_ITEM_DTL_STAT
dbms_output.PUT_LINE('v_RPT_PER_KEY=' || v_rpt_per_key);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END hd_purge_test;
Run Code Online (Sandbox Code Playgroud)
我收到表不存在的错误。
[Warning] ORA-24344: success with compilation error
14/21 PL/SQL: ORA-00942: …Run Code Online (Sandbox Code Playgroud) 我在连接要立即执行的字符串时遇到问题。任何人都知道下面的陈述有什么问题。
EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''||SMTPServer||''';
select smtpserver into SMTPServer from mytable;
if(SMTPServer is not null)
then
EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''||SMTPServer||''';
--*****above does not work, below does work****
EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''10.1.1.1''';
Run Code Online (Sandbox Code Playgroud) 完全是数据库新手。现在我创建了一个返回 NUMBER 的函数,我只想检查这个函数的结果。我使用的工具是 PL/SQL Developer,但我找不到输出窗口或其他任何东西。当然,在这种情况下,我不想在任何表中写入任何内容。作为 C++/C# 开发人员,我发现学习如何开发 PL/SQL 有点困难。我什至不能轻易看到我的函数的编译错误。
plsql ×10
oracle ×9
bulk-collect ×2
sql ×2
bash ×1
execute ×1
object-type ×1
ora-00942 ×1
oracle11g ×1
procedures ×1
shell ×1
sql-merge ×1
unix ×1
utl-mail ×1