Oracle中的PL/SQL过程能否知道它自己的名字?
让我解释:
CREATE OR REPLACE procedure some_procedure is
v_procedure_name varchar2(32);
begin
v_procedure_name := %%something%%;
end;
Run Code Online (Sandbox Code Playgroud)
后%%something%%执行,变量v_procedure_name应该包含"SOME_PROCEDURE".如果它包含object_id该过程也没关系,所以我可以查找名称all_objects.
什么是PLSQL(Oracle)相当于这个SQL服务器片段?
BEGIN TRAN
INSERT INTO mytable(content) VALUES ("test") -- assume there's an ID column that is autoincrement
SELECT @@IDENTITY
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)
在C#中,您可以调用myCommand.ExecuteScalar()来检索新行的ID.
如何在Oracle中插入新行,让JDBC获取新ID的副本?
编辑: BalusC提供了一个非常好的起点.由于某种原因,JDBC不喜欢命名参数绑定.这给出了"错误设置或注册的参数"SQLException.为什么会这样?
OracleConnection conn = getAppConnection();
String q = "BEGIN INSERT INTO tb (id) values (claim_seq.nextval) returning id into :newId; end;" ;
CallableStatement cs = (OracleCallableStatement) conn.prepareCall(q);
cs.registerOutParameter("newId", OracleTypes.NUMBER);
cs.execute();
int newId = cs.getInt("newId");
Run Code Online (Sandbox Code Playgroud) 我试图查看pl/sql过程和函数之间的区别,并找到链接http://it.toolbox.com/blogs/oracle-guide/learn-plsql-procedures-and-functions-13030.首先让我告诉你开发人员通常用pl/sql过程和函数做什么
1)想获得一些回报值.他可以用函数和程序来解决它.如果他想要返回单个值的函数,他可以使用return语句.如果他想要返回多个值,他可以使用inout参数来实现它.他可以使用inout参数从过程中获取返回值(不是使用return语句)
但只要他能够使用return语句或inout参数实现其意图,它对开发人员没有任何影响.
所以这里也可以互相替换.
2)他可以在功能和程序中使用DML.所以在这里他也可以使用其中任何一个来改变数据库的状态.
所以我没有得到任何具体的推理,哪一个可以在一些人可以互相替换.
我在某种程度上发现的唯一合理的原因是函数可以从SQL调用,程序不能
有人可以解释哪一个使用的时间和原因?
我正在编写一个PL/SQL过程,它根据输入变量执行选择,然后在select中为每个结果插入一行.由于我对PL/SQL的新意,我无法调试查询错误.我知道这一定很容易,但出于某种原因我被困在这里.谢谢你的帮助!
CREATE OR REPLACE PROCEDURE setup_name_map(ranking_id IN NUMBER, class_string IN VARCHAR2)
IS
BEGIN
FOR rec IN (SELECT NAME_ID FROM PRODUCT_NAMES WHERE NAME = class_string)
LOOP
EXECUTE IMMEDIATE 'INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID) VALUES (' || rec.NAME_ID || ', ' || ranking_id || ')';
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
根据Oracle Developer Compiler ...'NAME_ID'是无效的标识符.我试过把它放在引号中,但没有骰子.它还抱怨循环索引变量'REC'的使用无效.任何帮助深表感谢.
如何在PL/SQL中打印新行?我正在使用C语言中类似'\n'的东西.
例:
begin
dbms_output.put_line('Hi, good morning friends');
end;
Run Code Online (Sandbox Code Playgroud)
我需要的输出是这样的:
hi,
good
morning
friends
Run Code Online (Sandbox Code Playgroud) 这让我有点生气.我试图将一个变量添加到一个过程,但它没有工作 - 我刚收到此错误消息:
[错误]语法检查(25:7):ERROR第25行,第7列,结束_行25,结束_col 12,找到'号码',期望:; - 或 - ..:= DEFAULT NOT NULL - 或 - % - 或 - (.@
我在下面敲了一个非常基本的程序来解决这个问题,现在我完全陷入了困境,因为我看起来像是在做我所做的事情.为什么我不能声明如下所示的变量?我通常在SQL Server中编码,如果这是我的问题的任何线索.非常感谢有人可以提供帮助!
CREATE OR REPLACE PROCEDURE MRCS.pro_xxx_test1 (cats out sys_refcursor)
IS
declare
spoon number;
balls varchar2(3);
BEGIN
open cats for select * from dual;
end;
/
Run Code Online (Sandbox Code Playgroud) 作为PL/SQL中的新手,我一直在复制并粘贴以下触发器:
CREATE OR REPLACE TRIGGER FOO_TRG1
BEFORE INSERT
ON FOO
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :NEW.FOO_ID IS NULL THEN
SELECT FOO_SEQ1.NEXTVAL INTO :NEW.FOO_ID FROM DUAL;
END IF;
EXCEPTION
WHEN OTHERS THEN RAISE;
END FOO_TRG1;
/
ALTER TRIGGER FOO_TRG1 ENABLE;
Run Code Online (Sandbox Code Playgroud)
我怀疑所包含的异常处理代码什么都不做,可能只是被删除,因为如果出现问题,我会收到一条错误消息.我对吗?
(我猜这样的代码是进一步编辑先前代码的结果.)
如何更正以下SQL代码,特别是COALESCE部分?
insert into Stmt G (ID,blah,foo)
select
coalesce(SELECT ID FROM Stmt G WHERE G.CLAIMNO=C.CLNUMBER, select StmtSeq.nextval from dual),
c.blah,
d.foo
from claim c
left join d on ...;
Run Code Online (Sandbox Code Playgroud)
如果ClaimNo匹配,我将从Stmt表中获取ID,否则创建一个新ID.SQL中不允许这样做吗?我怎么能写这个陈述?
我现在正在coalesce部分出现"Missing Expression"错误.
有人可以帮我把我的pl/sql程序放在一个包中吗?我试过了,我正在努力:
这就是我的包装规格:
CREATE OR REPLACE PACKAGE film_pkg
IS
title VARCHAR2(100);
PROCEDURE get_films(fname VARCHAR2);
END film_pkg;
--
Run Code Online (Sandbox Code Playgroud)
这是我的包体,我遇到了问题:
CREATE OR REPLACE PACKAGE BODY film_pkg
IS
PROCEDURE get_films (fname IN film.title%TYPE,
r_date OUT film.release_date%TYPE,
dur OUT film.duration%TYPE)
AS
BEGIN
SELECT release_date, duration
INTO r_date, dur
FROM FILM
WHERE title = fname;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
r_date := '';
dur := '';
END get_films;
END film_pkg;
Run Code Online (Sandbox Code Playgroud)
如果有人可以帮我修复错误,我会很感激:
Error(4,11): PLS-00323: subprogram or cursor 'GET_FILMS' is declared in a package specification and must be defined …Run Code Online (Sandbox Code Playgroud) 当Oracle编译存储过程时,它以DIANA格式存储该过程的AST.