我想浏览所有表并将ID和tablename复制到表中.因为我必须使用变量作为表名,所以我尝试使用IMMEDIATE EXECUTE.但是对于动态SQL,INSERT INTO语句只允许单行.
如果 IMMEDIATE EXECUTE允许INSERT INTO使用muplitple行,则可以使用以下SQL语句.
DECLARE
sqlStat VARCHAR2(500);
BEGIN
FOR TName IN (
SELECT TABLE_NAME FROM all_tab_cols WHERE column_name='ID'
)
LOOP
sqlStat := 'INSERT INTO storeTab (ID,TABLE_NAME) SELECT ID, '' :1 '' FROM :2';
EXECUTE IMMEDIATE sqlStat USING TName.TABLE_NAME,TName.TABLE_NAME;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
如何循环表和收集记录?
我得到PL/SQL:ORA-00905:运行以下脚本时缺少关键字错误
create or replace procedure testing
(ass_line in char,
curs out sys_refcursor
)
is
begin
open curs for
select asl.Production_Group,asl.last_sequence_nbr
from ASSEMBLY_LINE asl
where(case
when ass_line='551F'
then asl.assembly_line in('551F','551C','551S')
else
asl.assembly_line=ass_line
end);
end;
Run Code Online (Sandbox Code Playgroud)
请帮帮我
我们正在使用PL/SQL中的Packages,我想知道我们是否可以以类似的方式工作.例如,Java,您可以在其中创建一个Package到另一个类似目录.例如:
myapplication.account.balance
Run Code Online (Sandbox Code Playgroud)
因此,我们可以使用具有相同名称但在不同子包中的包.
我只想使用替换变量来获取customer_name(varchar2).但是当我执行下面的子程序时,它会引发异常.
DECLARE
v_cid dummytest.customer_id%type := &customer_id;
v_cname dummytest.customer_name%type := &customer_name;
BEGIN
INSERT INTO dummytest ( customer_id,customer_name ) VALUES ( v_cid,v_cname );
COMMIT;
END;
Run Code Online (Sandbox Code Playgroud)
错误
Error report -
ORA-06550: line 3, column 47:
PLS-00201: identifier 'HUHU' must be declared
ORA-06550: line 3, column 15:
PL/SQL: Item ignored
ORA-06550: line 5, column 72:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 5, column 72:
PL/SQL: ORA-00904: "V_CNAME": invalid identifier
ORA-06550: line 5, column 5:
PL/SQL: …Run Code Online (Sandbox Code Playgroud) 以下是我的查询
Select Count(*)
from Table1 s
left join Table2 d
ON s.subjectid = d.subjectid
and s.PROJECTID = d.projectid
and s.SITEName = d.SITENAME
left join Table3 dev
on s.subjectid = dev.subjectid
and s.projectid = dev.projectid
and s.siteid = dev.siteid
Where s.isprod =1
and d.isprod =1
and dev.isprod = 1
and s.projectid =107
-- Output 301 ROWS
Run Code Online (Sandbox Code Playgroud)
现在,此查询返回给我301行,但是,如果我不使用Table3,那么联接将返回2203行,如下面的查询所示
Select Count(*)
from Table1 s
left join Table2 d
ON s.subjectid = d.subjectid
and s.PROJECTID = d.projectid
and s.SITEName = d.SITENAME
Where s.isprod =1 …Run Code Online (Sandbox Code Playgroud) 当我编译并运行程序时,我有点惊讶
绿色按钮如pic1所示,我从输出变量得到输出.
这是我的简单代码:
CREATE OR REPLACE PROCEDURE RUNPROCEDURE
(P_para1 in EMP.ID%type,P_PARA out SYS_REFCURSOR)
AS
BEGIN
OPEN P_PARA FOR
SELECT *
FROM emp
WHERE ID = P_para1;
END RUNPROCEDURE;
Run Code Online (Sandbox Code Playgroud)
但是当我从查询浏览器运行时,我没有看到任何输出:=
set serveroutput on;
declare P_PARA1 number;
P_PARA SYS_REFCURSOR;
begin
RUNPROCEDURE(
P_PARA1 => 2,
P_PARA => P_PARA
) ;
end;
/
Run Code Online (Sandbox Code Playgroud)
它只是显示
PL/SQL procedure successfully complete
Run Code Online (Sandbox Code Playgroud)
我没有看到任何输出.
任何帮助赞赏.
所以我尝试将此代码更改为动态SQL
SELECT LISTAGG(accounting_dept || '-'||REPLACE(full_desc,'''',''''''), '; ') WITHIN GROUP (ORDER BY accounting_dept) FROM table
Run Code Online (Sandbox Code Playgroud)
EXCUTE
12121-President''S Office
Run Code Online (Sandbox Code Playgroud)
我改为动态sql
EXECUTE IMMEDIATE
' SELECT LISTAGG(accounting_dept || ''-''||REPLACE(full_desc,'''''',''''''''), ''; '') WITHIN GROUP (ORDER BY accounting_dept) FROM table '
INTO v_task;
Run Code Online (Sandbox Code Playgroud)
错误是ORA-00907:缺少右括号
问题是这部分REPLACE(full_desc,''''','''''''',
如何在没有警告错误的情况下更改为动态sql?
我有这个PL/SQL程序,运行大约4-6分钟:
DECLARE
i NUMBER := 0;
begin
for x in (select anumber
, position
, character
from sdc_positions_cip
where kind = 'Name')
loop
update sdc_compare_person dcip
set dcip.GESNAM_D = substr(dcip.GESNAM_D, 1, x.position - 1) || x.character ||
substr(dcip.GESNAM_D, x.position + 1, length(dcip.GESNAM_D) - x.position)
where dcip.sourcekey = x.anumber;
i := i + 1;
IF i > 100 THEN COMMIT;
i := 0;
END IF;
end loop;
commit;
end;
/
Run Code Online (Sandbox Code Playgroud)
我在dcip.sourcekey和上放了一个索引x.anumber.它使用的表空间是10GB.
有没有办法让这个程序(更多)更快?
我只需要在PL/SQL代码中运行一个基本的SELECT查询.以下代码完美无缺:
BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM ' || 'TNAME';
END;
/
Run Code Online (Sandbox Code Playgroud)
但是遵循代码
BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM :1' USING 'TNAME';
END;
/
Run Code Online (Sandbox Code Playgroud)
提出错误说
ORA-00903:表名无效
ORA-06512:第2行
*原因:
*行动:
我不能以任何方式使用"USING"传递表名吗?
我是PL/SQL的新手,我的存储过程已经存在问题.它编译,但一个IF语句永远不会按需运行.
IF SUBSTR(p_phone_number, 5, 1) <> '2' OR SUBSTR(p_phone_number, 5, 1) <> '6' THEN
RAISE ex_phone_number_non_lv_custom2;
END IF;
Run Code Online (Sandbox Code Playgroud)
调用程序时,p_phone_number是'+37122222222'类型的VARCHAR2(12).我使用了服务器输出,SUBSTR(p_phone_number, 5, 1)并且它是预期的2,但是这个IF语句仍然引发了我的异常.为什么会这样?