【问题标题】:Dynamic column name throws ORA-01722:invalid number动态列名抛出 ORA-01722:invalid number
【发布时间】:2013-04-16 06:07:19
【问题描述】:

这是我实际问题的通用格式。我正在传递一个列名,以便根据子标题获取金额。

让我们假设表 XYZ 代表不同子标题字段的表,它们具有各自的年份,就像

id, office_id, subhead1, subhead2, subhead3, year

现在,参数test_column_name 不起作用。当我在那里手动放置一些字段时,它工作正常。我抛出错误:

"ORA-01722:invalid number"

我的功能是这样的:

CREATE OR REPLACE FUNCTION TEST_FUNCTION  (test_column_name in varchar)
RETURN float
IS
    AMOUNT float;
BEGIN    
    SELECT 
    SUM(AMOUNT) INTO AMOUNT FROM TEST_TABLE
    where
    TEST_FIELD IN 
        (
            SELECT DISTINCT test_column_name FROM XYZ_TABLE WHERE XYZ_YEAR='2012'
        );  
    return AMOUNT;    
END TEST_FUNCTION;
/

有什么建议吗?

【问题讨论】:

  • 你的意思是WHERE TEST_FIELD IN()而不是AND TEST_FIELD IN
  • 您在某处存在数据类型不匹配。发布列的数据类型。 TEST_FIELD 是数字数据类型吗?
  • 是的,TEST_FIELD是数值数据类型,test_column_name也是数值数据类型,但是test_column_name保存的是列名
  • 您想要究竟实现什么?您想动态决定要过滤的表列吗?那么你需要一种不同的方法。请发布一些示例输入和预期输出。
  • 是的,表列是动态的,它来自 test_column_name

标签: sql database oracle plsql oracle10g


【解决方案1】:

我认为您不能将“test_column_name”直接放入 SQL 中。您应该使用动态 Sql。

  EXECUTE IMMEDIATE 'SELECT SUM(AMOUNT) FROM TEST_TABLE  WHERE TEST_FIELD IN (SELECT DISTINCT  '||test_column_name||' FROM XYZ_TABLE WHERE XYZ_YEAR=''2012'')'
        INTO AMOUNT;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多