如何在PL/SQL中使用BULK COLLECT和FORALL替换CURSOR FOR LOOP?我想有一种更有效的方法来更新单个表中的记录.
假设我有以下PL/SQL代码:
DECLARE
var_buy_more_shoes inventory.buy_more_shoes%TYPE := NULL;
var_buy_more_bananas inventory.buy_more_bananas%TYPE := NULL;
var_buy_more_iphone6s inventory.buy_more_iphone6s%TYPE := NULL;
CURSOR cur
IS
SELECT *
FROM inventory
FOR UPDATE;
BEGIN
FOR rec IN cur
LOOP
IF rec.pair_of_shoes_left <= 100
THEN
var_buy_more_shoes := 'Yes';
END IF;
IF rec.weight_of_bananas_left <= 200
THEN
var_buy_more_bananas := 'Yes';
END IF;
IF rec.number_of_iphone6s_left <= 50
THEN
var_buy_more_iphone6s := 'Yes';
END IF;
UPDATE inventory a
SET A.buy_more_shoes = var_buy_more_shoes,
A.buy_more_bananas = var_buy_more_bananas,
A.buy_more_iphone6s = var_buy_more_iphone6s
WHERE CURRENT OF cur; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用GET存储过程/光标来显示我在彩票游戏数据库中创建的彩票游戏桌的游戏名称.
这是代码:
CREATE OR REPLACE PROCEDURE GetLotteryGameName (
p_lgid IN NUMBER,
p_value out VARCHAR2,
p_field IN VARCHAR2
)
IS
BEGIN
SELECT GAMENAME
INTO p_value
FROM LOTTERYGAME
WHERE LOTTERYGAMEID = p_lgid;
END GetLotteryGameName;
CREATE OR REPLACE PACKAGE GETLOTTERYGAMENAMEPKG IS
PROCEDURE GetLotteryGameName (
p_lgid IN NUMBER,
p_value out VARCHAR2,
p_field IN VARCHAR2
);
TYPE per_ref_cursor IS REF CURSOR;
PROCEDURE GetGameName (p_lgid IN NUMBER, p_ref OUT per_ref_cursor);
END GETLOTTERYGAMENAMEPKG;
CREATE OR REPLACE PACKAGE BODY GETLOTTERYGAMENAMEPKG IS
PROCEDURE GetLotteryGameName (
p_lgid IN NUMBER,
p_value …Run Code Online (Sandbox Code Playgroud) [解释]
如果我想创建一个属于模式'A'的函数,我的理解是我需要在模式'A'中创建包,并实现函数.(如果还有其他办法,请纠正我).
如果我试图使用脚本文件创建一个函数(例如.新图库 - > SQL文件(数据库文件)来创建untitled.sql),我会感到困惑,因为该函数不属于任何模式,它将被存储在全球.
[问题]
1)如何创建函数属于使用脚本的模式'A'?
2)存储在全局的函数无法访问模式表,我该如何解决?

select SEQUENCE_OWNER, SEQUENCE_NAME from ALL_SEQUENCES
Run Code Online (Sandbox Code Playgroud)
我们假设上面的代码会给我以下结果.
<Table Name: ALL_SEQUENCES>
SEQUENCE_OWNER SEQUENCE_NAME
schema1 table1_name_seq
schema1 table2_name_seq
schema2 table1_name_seq
Run Code Online (Sandbox Code Playgroud)
我很确定每个序列都有一个对应的父表,序列用于该表.所以,我想使用sequence_name找到父表.例如,如果我知道具有序列所有者schema1的序列名table1_name_seq,我应该找到表名schema1.table1.
建议不要使用SUBSTRING或REPLACE函数重新格式化字符串,因为sequence_name不遵循"良好一致的命名标准",我无权更改它.
我找不到有关此事的任何信息.非常感谢您的帮助!
我在Oracle中有一个触发器,它在特定表上插入或更新时被触发.在触发器内部,我想确定触发触发器的事件(无论是插入还是更新?).如何确定PL SQL中的事件信息?
我写了一个存储过程SP_DEMAND_QRY.如果表中只有几个匹配的行(5或6),则会生成正确的值Demand.但是如果该表包含更多匹配的行(> 6),那么当我执行它时会出现此错误:
Error:
-------
ORA-19011: Character string buffer too small
ORA-06512: at line 7
Run Code Online (Sandbox Code Playgroud)
程序是:
create or replace PROCEDURE SP_DEMAND_QRY
(
USR IN VARCHAR2
, OUT_CLOB OUT CLOB
) AS
BEGIN
SELECT to_clob(XMLElement("DEMANDS",XMLAgg(XMLElement("Demand"
,XMLElement("DemandId",dmnd_id)
,XMLElement("CreatedBy",CREATED_BY)
,XMLElement("CreatedDate",CREATED_DATE)
,XMLElement("Designation",DESIGNATION)
,XMLElement("Experience",EXPERIENCE)
,XMLElement("PrimarySkill",PRIMARY_SKILL)
,XMLElement("SecondarySkill",SECONDARY_SKILL)
,XMLElement("OtherSkill",OTHER_SKILL)
,XMLElement("RequiredDate",REQUIRED_DATE)
,XMLElement("ProbablePercentage",PROBABLE_PERCENTAGE)
,XMLElement("CriticalFlag",CRITICAL_FLG)
,XMLElement("AssignedFlag",ASSIGNED_FLG)
,XMLElement("AccountName",ACCOUNT_NAME)
,XMLElement("OpportunityName",OPTY_NAME)
,XMLElement("AccountPOC",ACCNT_POC)
,XMLElement("COE",COE)
,XMLElement("DemandType",DEMAND_TYPE)
,XMLElement("Location",LOC)
,XMLElement("ExpectedRole",EXPECTED_ROLE)
,XMLElement("ConfidenceFactor",CONFIDENCE_FACTOR)
,XMLElement("EndDate",END_DT)
,XMLElement("HiringSO",HIRING_SO)
,XMLElement("HiringSOId",HIRING_SO_ID)
,XMLElement("Comments",COMMENTS)
))))
into OUT_CLOB
from demand s
where s.CREATED_BY=usr;
--DBMS_output.put_line(OUT_CLOB);
END SP_DEMAND_QRY;
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
有两个链接 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#LNPLS99981和
通过引用以上两个链接,我有两个疑问
1.哪个是正确的嵌套表?
2.如果oracle文档是正确的,嵌套表和关联数组有什么区别?
我想从我的函数中的某个网页获取HTML内容。我读过我可以用PLSQL中的UTL_HTML包来做到这一点。因此,我在项目中编写了以下代码:
v_webcontent := utl_http.request(v_weblink);
Run Code Online (Sandbox Code Playgroud)
在此先声明了v_webconent和v_weblink。在功能中运行此命令会导致PLSQL异常:PLS-00201: identifier 'UTL_HTTP' must be declared我想这个问题是因为该软件包不可用(来自此链接:相同的错误消息)。
我听从了建议。因此,我以SYSTEM角色的身份在sql developer中创建了一个新的数据库连接(SYS无法正常工作,它说我只能使用SYSDBA或SYSOPER登录,但两者都不会采用我在数据库中创建的标准密码)。然后,我在上面的链接中输入了代码。
GRANT EXECUTE ON SYS.UTL_HTTP TO [database];
Run Code Online (Sandbox Code Playgroud)
我创建的用户名为“数据库”。它首先给我一个没有[]方括号的错误。表格或视图不存在,因此我将其放在方括号中。现在它给出了错误:
Error starting at line : 1 in command -
GRANT EXECUTE ON SYS.UTL_HTTP TO [database]
Error report -
SQL Error: ORA-00987: missing or invalid username(s)
00987. 00000 - "missing or invalid username(s)"
*Cause:
*Action:
Run Code Online (Sandbox Code Playgroud)
所以我不知道如何解决这个问题。在上面的链接中,OP说他还有另一个错误,因此我还检查了我是否没有同样的问题。我进入了:
SELECT * FROM dba_objects WHERE object_name='UTL_HTTP'
Run Code Online (Sandbox Code Playgroud)
它返回了4个条目。与所有者:SYS,SYS,PUBLIC和APEX_040000。
有人可以帮我吗?我需要以SYS身份登录并且使用什么密码?
我在一个过程中有这段代码:
if val is NULL
then
creb :=0;
else
creb := val;
end if;
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式来处理null?
我正在尝试通过在运行时确定的DBLink运行一组查询(来自配置或其他输入).我见过许多建议使用动态SQL和EXECUTE IMMEDIATE的例子.我想不惜一切代价避免这种情况,因为我的查询冗长且可能会发生变化,因此将它们放在字符串中会使维护变得更加困难.
我尝试让我的查询引用同义词,然后在执行查询之前更新同义词:
EXECUTE IMMEDIATE 'CREATE OR REPLACE SYNONYM my_tbl_s FOR my_tbl_t' || p_dblink_name;
SELECT * FROM my_tbl_s;
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我想在一个包中使用它,所以当我执行create synonym时,包无效.我也试过将我的代码分成不同的包并在同义词更新后重新编译:
EXECUTE IMMEDIATE 'ALTER PACKAGE my_pck COMPILE';
Run Code Online (Sandbox Code Playgroud)
但是,原始调用包仍然无效.谁能想到一种在不使用动态SQL的情况下实现动态DB链接的方法?
plsql ×10
oracle ×8
sql ×3
bulk-collect ×1
dblink ×1
for-loop ×1
forall ×1
nested-table ×1
oracle10g ×1
settings ×1