有人可以帮我将以下sql代码转换成程序吗?我已经阅读了一些www源并得出结论(可能)它应该是包?
TRUNCATE TABLE MY_SCHEME.MAYA;
INSERT INTO MY_SCHEME.MAYA (ID_TEST,
IQ,
DATE_,
COMMENT1)
SELECT ID_TEST,
IQ,
DATE_,
COMMENT1
FROM MY_SCHEME.STAGE_MAYA
where STAGE_MAYA.ID_TEST=(select max (ID_TEST) from MY_SCHEME.STAGE_MAYA)
非常感谢!
答案 0 :(得分:2)
根据您的最终要求,您可以使用PROCEDURE
或FUNCTION
。
一个程序可以完成工作,但您必须查询MAYA
表以查看您插入的记录数。
即
CREATE OR REPLACE
PROCEDURE maya_insert
IS
BEGIN
-- Truncate the maya table
EXECUTE IMMEDIATE 'TRUNCATE TABLE MY_SCHEME.MAYA';
--
-- Insert records into maya
INSERT INTO MY_SCHEME.MAYA
(
ID_TEST,
IQ,
DATE_,
COMMENT1
)
SELECT ID_TEST,
IQ,
DATE_,
COMMENT1
FROM MY_SCHEME.STAGE_MAYA
WHERE STAGE_MAYA.ID_TEST = (SELECT MAX(ID_TEST)
FROM MY_SCHEME.STAGE_MAYA);
EXCEPTION
WHEN others
THEN
DBMS_OUTPUT.put_line('MAYA_INSERT error: '||sqlerrm);
END maya_insert;
除非您在此过程之外提交事务,否则您可能还想在其中添加COMMIT;
,如果您确实添加了COMMIT;
,那么还会在异常中添加ROLLBACK;
部分。
请注意,TRUNCATE
语句无法回滚,因为它是DDL
。如果你需要能够回滚它,那么你将不得不使用较慢的DELETE
命令DML
。
如果您需要知道在MAYA
中插入了多少条记录,请使用函数:
即
CREATE OR REPLACE
FUNCTION maya_insert
RETURN NUMBER
IS
BEGIN
-- Truncate the maya table
EXECUTE IMMEDIATE 'TRUNCATE TABLE MY_SCHEME.MAYA';
--
-- Insert records into maya
INSERT INTO MY_SCHEME.MAYA
(
ID_TEST,
IQ,
DATE_,
COMMENT1
)
SELECT ID_TEST,
IQ,
DATE_,
COMMENT1
FROM MY_SCHEME.STAGE_MAYA
WHERE STAGE_MAYA.ID_TEST = (SELECT MAX(ID_TEST)
FROM MY_SCHEME.STAGE_MAYA);
-- Return the number of records inserted
RETURN SQL%ROWCOUNT;
EXCEPTION
WHEN others
THEN
DBMS_OUTPUT.put_line('MAYA_INSERT error: '||sqlerrm);
RETURN -1;
END maya_insert;
在这里,您将获得插入的记录数,如果出现错误,则会返回-1
。如果您需要,请参阅上面的COMMIT;
和ROLLBACK;
的评论。
关于包裹。包用于在数据库中将逻辑相关的函数过程和其他处理组合在一起。由于您只有一个过程或函数,因此在此阶段无需将其包装在包中。 请参阅:http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/09_packs.htm#362
希望它有所帮助...
答案 1 :(得分:0)
包可以包含多个过程,函数,变量和定义。您在包上发出授权而不是它包含的功能。一个主要区别是,当包中的函数代码需要更改时,您可以替换包体(创建或替换语法),这不会导致依赖代码失效。更改包外的函数将始终导致相关代码无效。
在您的情况下,您需要一个程序