我有一个存储过程,其下面的基本布局返回一个sys_refcursor作为结果集.(从技术上讲,它重新发布了四个,但为了清楚起见,我只说一个).结果集是临时表的选择.
procedure aProcedure
( C1 in out sys_refcursor
) is
begin
--populate Temp_Table here with a stored proc call;
OPEN C1 FOR
SELECT Cols
FROM TEMP_TABLE;
Run Code Online (Sandbox Code Playgroud)
我需要使用不同的存储过程将C1中的结果集插入到永久表中.这是可行的还是我需要重新构建结果集?
我已经能够找到有关使用oracle之外的游标和结果集的信息,但不能在其内部使用它们.
我知道从第一个存储过程执行插入可能是有意义的,但这不是我真正需要它发生的方式.永久保存结果集是一项可选要求.
感谢任何有用的信息.
我有一个下面显示的更新语句工作正常,我在子查询中使用了with语句来大大提高性能但是由于某种原因我不允许从同一个表中添加额外的列来更新.
作品:
UPDATE Table_A SET (Col_One) = (WITH OneValue AS (SELECT DISTINCT t.Col_One
FROM Table_Two t, Table_A a
WHERE t.id = a.New_Id))
SELECT Col_One FROM OneValue);
Run Code Online (Sandbox Code Playgroud)
我想要做的只是包括另一个列来更新table_two像这样
UPDATE Table_A SET (Col_One, Col_Two) = (WITH OneValue AS (SELECT DISTINCT t.Col_One, T.Col_two
FROM Table_Two t, Table_A a
WHERE t.id = a.New_Id))
SELECT Col_One, Col_Two FROM OneValue);
Run Code Online (Sandbox Code Playgroud)
但我得到ora-01767更新集表达式必须是子查询.我理解这个错误,但没看到我是如何生成它的.任何帮助是极大的赞赏.
提前致谢.
我有一系列需要在Oracle包中使用的更新语句.这种情况很少见,但可能会出现偶然且不可避免的用户错误,导致其中一个更新语句抛出"单行子查询返回一行或多行"错误.
我一直在研究oracle PL/SQl的异常处理,我对如何以及使用什么来捕获这个异常有点困惑,因此包不会崩溃.
我知道预先构建的"Too Many Rows"异常条款存在,但我读到的所有内容似乎都说它用于不正确的插入语句.
我可以将此作为我的例外吗?或者我是否需要构建自己的异常子句.我以前从来没有自己建造一个,只是粗略地想知道在哪里放置所需的一切.
下面的代码基本上是如何在这个特定的过程中设置更新,但为了简洁起见,我只是使用一个简单的例子来说明它的外观.
INSERT INTO TempTable... --(Initial insert statement)
UPDATE TempTable t SET t.Row_one = (SELECT (Statement_One))
WHERE T.Row_One is NULL
UPDATE TempTable t SET t.Row_one = (SELECT (Statement_Two))
WHERE T.Row_One is NULL
UPDATE TempTable t SET t.Row_one = (SELECT (Statement_Three))
WHERE T.Row_One is NULL
-- Does the exception clause start here?
EXCEPTION
WHEN TOO_MANY_ROWS THEN
(What do I tell the Procedure to do here, what am I able to tell it to do?)
--end …Run Code Online (Sandbox Code Playgroud) 我一直在构建一个相当简单的更新语句,其中包含一个嵌套的case语句来确定更新值.列描述与nvarchar(32)相同.对于这两个字段.
代码如下
UPDATE TableA t
SET t.Last_Col =
( CASE WHEN t.First_Col = 'ItemOne'
THEN 'anItemOne'
WHEN t.First_Col = 'ItemTwo'
THEN CASE WHEN t.Second_Col = 'ItemTwo_A'
THEN 'aSecondItem_A'
ELSE 'aSecondItem'
END
ELSE 'NoItem'
END
);
Run Code Online (Sandbox Code Playgroud)
该代码有效但当我尝试使用t.First_Col代替字符串'NoItem'时,我得到的字符集不匹配.
ELSE t.First_Col
END
);
Run Code Online (Sandbox Code Playgroud)
不起作用.t.First_Col和t.Last_Col都是nvarchar2(32)并且我一直在尝试使用我认为不应该需要的演员.
ELSE CAST(t.First_Col AS NVARCHAR2(32))
END );
Run Code Online (Sandbox Code Playgroud)
任何提示或建议都非常感谢.一如既往地提前感谢.
有人可以帮助我理解为什么我可以在包中声明硬编码的日期值但不能从查询中指定值吗?
我已经看到了许多示例(包括参考书),它们显示了硬编码值的声明,但是我无法找到通过查询为变量赋值的示例.
Oracle 11g.
这是允许的
create or replace package body PACKAGE_NAME AS
tDate DATE := '2012-05-30';
...procedues follow
Run Code Online (Sandbox Code Playgroud)
这是允许的
create or replace package body PACKAGE_NAME AS
tDate DATE := sysdate;
Run Code Online (Sandbox Code Playgroud)
这是不允许的
create or replace package body PACKAGE_NAME AS
tDate DATE := select MAX(date_) from Table_Name;
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多方法,最后我很好,它没有工作(我可以在程序本身中根据需要使用它)但我不明白为什么我不能为tDate赋值办法?
具体的错误是"在期待......时遇到符号'SELECT'".
在此先感谢大家的见解
补充一点,我可以通过存储过程中的查询获得变量值,但相同的过程似乎不适用于包体.
PROCEDURE Proc_Name IS
tDate Date;
BEGIN
SELECT MAX(date_) into tDate from Table_Name;
Run Code Online (Sandbox Code Playgroud) 我有一个很长的PL/SQL,除了where子句的一小部分外,它运行良好.
我期望应该返回一行,但是,因为where子句检查的字段为null,所以尽管符合条件,仍不会返回该行.
我在这里读了一篇非常好的说明:http:
//jonathanlewis.wordpress.com/2007/02/25/not-in/
它解释了Null如何影响NOT IN语句,我认为它也不同于NOT LIKE.
我无法找到的是我需要的替代品.我是否需要以某种方式将其切换为IN和LIKE,或者如果NUll提供返回行的内容?
这是我的代码的简化版本.
SELECT * FROM Temp_Table T
WHERE -- Other where constraints
AND (T.Col_One NOT LIKE 'AString'
OR T.Col_Two NOT IN ('BString','CString'))
Run Code Online (Sandbox Code Playgroud)
在我的情况下,Col_One和Col_Two中的行都将为空.
任何帮助是极大的赞赏.
谢谢.
我正在浏览AskTom网站,发现什么应该是一个非常强大的更新状态工具,但我的声明拒绝接受子查询后的别名.有人可以帮我解释一下,并可能显示一个解决方案吗?
Update (SELECT T.Date_,T.Name_
FROM TableA T, TableB P
WHERE P.Date_ = T.Date_
AND P.Name_ = T.Name_) SET P.ID = T.Name_
Run Code Online (Sandbox Code Playgroud)
关于如何运行此类更新可能存在其他问题,这将是一个奖励.在尝试理解别名问题时,我对此更感兴趣.我试图分入
TableB.ID = TableA.Name_
Run Code Online (Sandbox Code Playgroud)
但没有运气
具体来说错误是ORA-00904无效的标识符.
一如既往地提前感谢.
上面的问题已经回答了我,但我确实有其他一些,因为我试图理解它.
我现在得到ORA-01779无法修改映射到非密钥保留表的列.我认为这是指我正在尝试更新正确的表格?因为我可以从视图或任何其他可能没有pk或fk的适当来源更新.
这种类型的更新语句可以与Oracle临时表一起使用,还是我可以预料到问题?
我可以将这种类型的语句与case语句一起使用来更新TableA中的多个列,还是会出现问题?
再次感谢.
我在这个问题上看到了很多变化,但在询问比较空值时,他们似乎都在讨论性能和索引.
我的问题是我有一个嵌套的SELECT,它可以返回null,我根据日期参数进行比较.
SELECT a.*
FROM Table_One a,
Table_Two b
WHERE a.Fieldc IN (SELECT CompareValue from Table_Three cv WHERE inDate between cv.Date_ and SYSDATE)
AND a.Fielda = b.Fieldb(+)
Run Code Online (Sandbox Code Playgroud)
看起来当嵌套选择返回null时,左连接会混乱.
如果需要,我会很乐意包含一些假数据,但也许我只是遗漏了一些东西.我需要发生的是Fieldc比较只发生在该日期规范中.
感谢您的任何见解.谢谢.
更多的信息:
Table_One数据:所有字段都是varchar2
Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'eVal | 'fVal'|
'dVal' | 'fVal | 'eVal'|
Run Code Online (Sandbox Code Playgroud)
Table_Two数据:所有字段都是varchar2
Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'fVal | 'gVal'|
'dVal' | 'fVal | 'cVal'|
Run Code Online (Sandbox Code Playgroud)
Table_Three数据:CompareValue是varchar2,date_是日期
CompareValue | date_ |
'fval' | …Run Code Online (Sandbox Code Playgroud) 我需要在Oracle查询中对结果集中的最后7个字符进行RTRIM.这7个字符可以是任何东西; 空格,字母数字等......我不知道任何值的确切长度.
所以例如我想运行这样的东西
SELECT RTRIM (COl_A, (SELECT LENGTH (COL_A)-7) FROM TABLE_ONE;
Run Code Online (Sandbox Code Playgroud)
或替换等价物
SELECT REPLACE(COL_A, (SELECT LENGTH (COL_A)-7 FROM TABLE_ONE),'');
Run Code Online (Sandbox Code Playgroud)
我是否需要对SUBSTRING做些什么?
我知道如何删除/替换特定字符,但在处理未知字符时我遇到了麻烦.我已经看到了一些类似问题的例子,但它们似乎不必要地复杂......或者这需要比我想象的更深入的解决方案吗?
一如既往地感谢您的建议或提示.
我有一些我无法弄清楚的逻辑谜题.
我有一个表有两列代表PK的表.Prods和Prod_Colour
TableA
Prods, Date_, Prod_Colour
One | null | Red
One | null | Blue
Two | 2012-06-08| Blue
Two | null | Yellow
Three| null | Green
Three| 2012-06-08| Red
Run Code Online (Sandbox Code Playgroud)
该日期再次表明那些Prods从该日期起不再可用,但是一旦再次可用,日期可以更改.
我能够根据日期限制行.
SELECT a.*
FROM TABLEA a
WHERE Date_ > '2012-06-11' or Date_ IS NULL
Run Code Online (Sandbox Code Playgroud)
但我需要做的是在子查询中使用此表,其中Prods和Prod_Colour在排除中合并...
这不是一个很好的解释,但基本上在Prods Three的例子中,其中Prod_Colour ='Red'和Prods Two,其中Prod_Colour ='Blue'将被排除,但Prods One将被包括在Prod_Colour中,其中date>今天或null.
一如既往,我感谢任何建议或提示.
提前致谢.
为了进一步澄清,我有一个从几个不同的表中选择的查询,其中一个表中我需要包含prods和prod_Colour,其中prods和Prod_Colour(组合作为每行的唯一标识符)在TableA中可用,其中date_表示它们可用.组合不会改变,但date_可以.我会用tDate来表示今天要比较的日期.
Select O.Prods, O.Prod_Colour /*each combination needs to match the combination in TableA */
FROM TableB
Where O.Prods + O.Prod_C in (Select A.Prods + …Run Code Online (Sandbox Code Playgroud)