dtuzjzs3853 2015-12-21 13:35
浏览 30
已采纳

如何从函数(存储过程)获取INPUT值? 与高朗

ALL How to get a INOUT parameter value from a function(stored procedure) so as,I want to get the value of v_id :

CREATE OR REPLACE FUNCTION mytest(
    IN v_name character varying,
    INOUT v_id bigint)
  RETURNS bigint AS
$BODY$  
    Begin  
        v_id := 99;
        select  v_name;
        return ;
    END;
    $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

When I call this func, look this,and I use the library from github.com/lib/pq,and my program has panic:

  func main() {
    dbstring := "user=postgres dbname=xxx password=xxx host=127.0.0.1            port=5432  sslmode=disable"
    db, err := sql.Open("postgres", dbstring)
       db.SetMaxIdleConns(4)
    db.SetMaxOpenConns(10)
    if err != nil {
        panic(err)
    }
var mynum int64 = 0
var s string
a, err2 :=  db.Query("SELECT mytest($1::TEXT,$2::bigint)","lihao",mynum)
if err2 != nil {
    fmt.Fprintln(os.Stderr, "Error sending mytest:", err)
    //os.Exit(1)
}else{
    fmt.Fprintln(os.Stdout, "a is:",a)
    fmt.Fprintln(os.Stdout, "mynum is:",mynum)
}
for a.Next() {
    err = a.Scan(&s, &mynum)
    if err != nil {
        panic(err)
    }
   fmt.Fprintln(os.Stdout, "mynum is:",mynum)
 }
}

it is panic, so here:

D:\Go>fs_con.exe
Error sending mytest: 
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x20 pc=0x48d4b9]

goroutine 1 [running]:
database/sql.(*Rows).Next(0x0, 0xc082028018)
c:/go/src/database/sql/sql.go:1633 +0x29
main.main()
D:/Go/fs_con.go:35 +0x48d

goroutine 5 [chan receive]:
database/sql.(*DB).connectionOpener(0xc0820683c0)
c:/go/src/database/sql/sql.go:634 +0x4c
created by database/sql.Open
c:/go/src/database/sql/sql.go:481 +0x33d
  • 写回答

1条回答 默认 最新

  • doulipi3742 2015-12-21 15:35
    关注

    Your function doesn't know what result to return. And it's better to add new variable in function.

    CREATE OR REPLACE FUNCTION mytest(
        IN v_name character varying,
        IN v_id bigint)
      RETURNS bigint AS
    $BODY$  
      DECLARE
        result bigint;
      BEGIN  
        result := v_id + 1;
        return result;
      END;
    $BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图2.0 版本点聚合中Marker的位置无法实时更新,如何解决呢?
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题