Regarding Store Procedure in Golang to Oracle DB

8 views
Skip to first unread message

Nisarg Desai

unread,
5:35 PM (2 hours ago) 5:35 PM
to golang-nuts
Hi There Golang-nuts. 

I am seeking help for my go lang project.

I am having an oracle server and in that there are many Db's Now I am createing a store procedure which has almost 20 parameters which are used multiple times in one single query. 

Now I checked GO does not support reuse of same parameters so if I have already used order_id as a parameter while passing query to be executed I can not use the order_id parameter anywhere else in the query. 

So I created a store procedure which would be easier but now in oracle while running the store procedure I am running it as follows 

    var rows *sql.Rows

    _, err := r.db.QueryxContext(
        ctx,
        `BEGIN
        PSIGWAY.get_transactions(
            :1, :2, :3, :4, :5, :6, :7, :8, :9, :10,
            :11, :12, :13, :14, :15, :16, :17, :18,
            :19, :20
        );
     END;`,
        request.StoreID,
        request.DateFrom,
        request.DateTo,
        request.Status,
        request.Action,
        request.AuthCode,
        request.OrderID,
        request.UserId,
        request.CustomerIP,
        request.CardType,
        request.CardSpan,
        request.DateFilterType,
        request.AmountFilterType,
        request.Amount,
        request.BillingName,
        request.BillingPostalCode,
        request.BillingProvince,
        Requestpage,
        "GetTransactions",
        sql.Out{Dest: &rows}, // 🔥 THIS IS THE KEY
    )
    if err != nil {
        return response, err
    }
    defer rows.Close()

    for rows.Next() {
        var o models.OrderSummary
        err := rows.Scan(
            &o.IMID,
            &o.OrderID,
            &o.TrxID,
            &o.Amount,
            &o.Name,
            &o.Card,
            &o.UserId,
            &o.Date,
            &o.Action,
            &o.Result,
            &o.ReturnCode,
            &o.External_Reason,
            &o.IDEBITISSNAME,
            &o.IDEBITISSCONF,
            &o.ACQCONFCODE,
        )
        if err != nil {
            return response, err
        }

        orders = append(orders, o)
    }

    if err := rows.Err(); err != nil {
        return response, err
    }

    // Post-processing
    for i := range orders {
        transType := "IOP_TRANSACTIONS"
        if orders[i].TrxID > "2000000000000000000" {
            transType = "CC_TRANSACTIONS"
        }

        orders[i].ActionText = utils.GetActionText(orders[i].Action, transType)
        orders[i].ResultText = utils.GetResultText(orders[i].Result, transType)
        orders[i].ReturnCodeText = utils.GetReturnCodeText(
            orders[i].Result,
            orders[i].TrxID,
            orders[i].ReturnCode,
            orders[i].IDEBITISSNAME,
            orders[i].IDEBITISSCONF,
            orders[i].ACQCONFCODE,
            orders[i].External_Reason,
        )
    }

    response.TotalResults = len(orders)
    response.Orders = orders


but it throws me an error reflect: call of reflect.Value.Type on zero Value
/usr/local/go/src/reflect/value.go:2474 (0x4c034d)
        Value.abiTypeSlow: panic(&ValueError{"reflect.Value.Type", Invalid})
/usr/local/go/src/reflect/value.go:2462 (0x4c021c)
        Value.typeSlow: return toRType(v.abiTypeSlow())
/usr/local/go/src/reflect/value.go:2457 (0x6fc1fb)
        Value.Type: return v.typeSlow()
/home/ndesai/go/pkg/mod/github.com/godror/god...@v0.49.4/stmt.go:3409 (0x6fc1ab)
        (*conn).getStructObjectType: rvt := rv.Type()
/home/ndesai/go/pkg/mod/github.com/godror/god...@v0.49.4/stmt.go:1465 (0x6e9393)
        (*statement).bindVarTypeSwitch: if ot, err := st.conn.getStructObjectType(ctx, value, ""); err != nil { Now it is because of the sq.out but not sure How to solve this issue and get it running I have spent almost 3 weeks on this please help me with this and help me resolve it Thank you.


Reply all
Reply to author
Forward
0 new messages